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 ?

Susan Sarandon
Libérer: 2024-12-20 02:02:09
original
417 Les gens l'ont consulté

Why Doesn't Floating-Point Addition Always Follow the Associative Law?

Arithmétique à virgule flottante : explorer l'associativité dans les opérations à virgule flottante

Dans le domaine de la programmation, les nombres à virgule flottante sont essentiels pour travailler avec des valeurs continues. Cependant, l'arithmétique à virgule flottante peut parfois se comporter différemment des mathématiques que nous avons apprises à l'école, notamment en matière d'associativité.

Prenons l'exemple de l'ajout de trois valeurs à virgule flottante et de leur comparaison à 1 :

cout << ((0.7 + 0.2 + 0.1) == 1) << endl; // output is 0
cout << ((0.7 + 0.1 + 0.2) == 1) << endl; // output is 1
Copier après la connexion

Curieusement, les deux expressions produisent des résultats différents. Cet écart vient du fait que l’addition en virgule flottante n’est pas toujours associative. En d'autres termes, changer l'ordre dans lequel nous ajoutons des valeurs peut modifier le résultat final.

Le phénomène de non-associativité survient en raison des limites de la représentation en virgule flottante. Les nombres à virgule flottante utilisent un format binaire avec un nombre fini de bits, ce qui limite leur précision. Par conséquent, les calculs avec des nombres à virgule flottante peuvent introduire des erreurs d'arrondi qui s'accumulent au fil de plusieurs opérations.

Dans l'exemple ci-dessus, l'ajout de 0,7, 0,2 et 0,1 entraîne des valeurs intermédiaires légèrement différentes selon l'ordre. d'opérations. Ces légères différences se propagent lors des ajouts ultérieurs, conduisant finalement à des résultats finaux différents.

Pour mieux comprendre ce concept, considérons un exemple tiré de l'article fondateur de David Goldberg « Ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante » :

(1e30 + -1e30) + 1 = 1, while 1e30 + (-1e30 + 1) = 0
Copier après la connexion

Dans ce cas, les parenthèses affectent profondément le résultat. L'ajout de 1e30 et -1e30 entre parenthèses donne une valeur proche de zéro en raison de l'arrondi, qui est ensuite ajoutée à 1. En revanche, l'ajout de 1e30 et le résultat de -1e30 1 produit une valeur non nulle.

Par conséquent, lorsque vous travaillez avec l'arithmétique à virgule flottante, il est crucial d'être conscient de la non-associativité potentielle et d'être prudent lors de la manipulation d'expressions impliquant ajouts répétés ou autres opérations associatives.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal