Rust 1.98 a introduit des méthodes flottantes algébriques permettant davantage d’optimisations. Leur intérêt dépend des écarts numériques acceptables pour le calcul. La maintenance 1.98.1 compte aussi pour choisir le compilateur réellement utilisé.

L’opération accepte une sémantique numérique différente
L’annonce de 1.98.0 introduit addition, soustraction, multiplication, division et reste algébriques sur f32 et f64. Ces méthodes autorisent des transformations qu’une expression flottante ordinaire ne peut pas supposer, ouvrant notamment des possibilités de regroupement et de vectorisation.
La documentation des opérateurs algébriques ne fixe ni ensemble exact d’optimisations ni borne d’erreur. Elle décrit des résultats non déterministes, des réserves sur les valeurs spéciales et l’interdiction pour du code unsafe de fonder sa validité sur les propriétés du résultat. Les opérations elles-mêmes n’introduisent pas de comportement indéfini ; cela ne valide pas chaque hypothèse unsafe faite ensuite.
Un petit exemple montre l’effet de l’ordre
Considérons l’addition binary64 ordinaire arrondie au représentable le plus proche, avec départage au pair. Posons a = 10¹⁶, b = −10¹⁶ et c = 1.
- Le regroupement (a + b) + c annule d’abord les grandes valeurs puis retourne 1.
- Le regroupement a + (b + c) perd le petit incrément par arrondi dans la somme intérieure puis retourne 0.
Nous avons vérifié ce calcul localement avec les nombres binary64 de JavaScript. Il illustre le regroupement ; ce n’est pas un test du compilateur Rust ni la promesse qu’algebraic_add choisira l’une de ces formes. En arithmétique réelle exacte, les expressions coïncident. La représentation finie rend leur ordre observable.
Affirmer que l’erreur serait toujours négligeable n’aiderait donc pas. L’application doit définir précision et reproductibilité attendues avant d’assouplir son calcul.
Mesurer ensemble le travail et l’erreur
Pour un essai proposé, gardez l’implémentation originale comme référence et ne modifiez que l’opération ciblée. Utilisez des entrées représentatives, dont annulations et écarts d’ordre de grandeur, avec une tolérance absolue ou relative définie. Mesurez ensuite le temps dans les mêmes conditions de compilation et de matériel.
Un écart isolé de facteur huit rapporté ailleurs ne démontre pas une amélioration de facteur huit pour chaque programme Rust. Autoriser la vectorisation ne garantit pas non plus que l’optimiseur l’appliquera à une boucle précise.
Utiliser le compilateur corrigé de la série 1.98
La version Rust 1.98.1 du 3 septembre corrige un autre problème de 1.98.0 : une entrée nulle pouvait remplacer un pointeur de fonction dans la vtable d’un objet de trait. L’équipe décrit un comportement indéfini dans le code produit. Cela ne relève pas de l’assouplissement intentionnel des opérations algébriques.
La série ajoute aussi le formatage d’entiers par NumBuffer et format_into. Il peut remplacer certains usages spécialisés, sous réserve de compatibilité avec l’API et les exigences de performance de l’application. Mettre le compilateur à jour et assouplir une boucle numérique restent deux changements distincts.
Revue du 8 septembre : documentation actuelle et annonces d’origine vérifiées, explications et médias repris.