Arithmétique à virgule flottante : l'associativité en question
Lorsqu'il s'agit d'opérations mathématiques, l'associativité dicte que l'ordre des opérandes n'affecte pas l'ordre des opérandes. résultat. Cependant, dans le domaine de l’arithmétique à virgule flottante, l’associativité n’est pas toujours vraie. Cela peut conduire à des résultats inattendus, comme l'illustre un problème courant rencontré par les programmeurs.
Considérez cet exemple :
cout << ((0.7 + 0.2 + 0.1) == 1) << endl; // Output: 0 cout << ((0.7 + 0.1 + 0.2) == 1) << endl; // Output: 1
Étonnamment, la comparaison avec 1 produit des résultats différents selon l'ordre dans auquel les valeurs à virgule flottante sont ajoutées. Pourquoi cela se produit-il ?
La nature non associative de l'addition à virgule flottante
Le coupable derrière ce comportement réside dans la nature de l'arithmétique à virgule flottante elle-même. Les nombres à virgule flottante sont représentés à l'aide d'un nombre fini de bits, ce qui introduit des erreurs d'arrondi lors de l'exécution des opérations. Cette imprécision peut se manifester par des écarts par rapport aux lois d'associativité attendues.
Comme expliqué dans l'article faisant autorité « Ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante », la règle empirique suivante s'applique :
Exemple :
If x = 1e30, y = -1e30, and z = 1, then: (x + y) + z = 1 x + (y + z) = 0
Implications pour Programmeurs
Comprendre la non-associativité de l'addition à virgule flottante est crucial pour une programmation précise. Pour éviter des résultats inattendus, les programmeurs doivent respecter les directives suivantes :
En adhérant à ces directives, les programmeurs peuvent atténuer l'impact des limitations d'associativité dans l'arithmétique à virgule flottante et garantir un programme précis et prévisible. comportement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!