Maison >développement back-end >C++ >Pourquoi l'addition à virgule flottante ne suit-elle pas toujours la loi associative ?

Pourquoi l'addition à virgule flottante ne suit-elle pas toujours la loi associative ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-14 17:51:10867parcourir

Why Does Floating-Point Addition Not Always Follow the Associative Law?

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 :

  • Utilisation explicite des parenthèses : Utilisez toujours des parenthèses pour définir explicitement l'ordre des opérations pour les calculs à virgule flottante.
  • Évitez de trop vous fier à l'associativité : Ne présumez pas que l'ordre d'addition ou de multiplication n'a pas d'importance pour les variables à virgule flottante.
  • Envisagez des algorithmes spécifiques à la virgule flottante : Étudiez les algorithmes conçus spécifiquement pour l'arithmétique à virgule flottante qui tiennent compte des problèmes de précision potentiels.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn