L'associativité de l'arithmétique à virgule flottante
Dans le domaine de la programmation, les nombres à virgule flottante sont couramment utilisés pour représenter des valeurs réelles. Cependant, les opérations fondamentales d'addition et de multiplication sur ces valeurs à virgule flottante peuvent ne pas toujours se comporter comme prévu.
Une question qui se pose souvent est de savoir si l'addition et la multiplication à virgule flottante sont associatives. L'associativité implique que l'ordre dans lequel les opérandes sont ajoutés ou multipliés n'affecte pas le résultat final. Bien que la multiplication soit effectivement associative pour les nombres à virgule flottante, l'addition ne l'est pas.
Ce manque d'associativité devient apparent en observant le code suivant :
cout << ((0.7 + 0.2 + 0.1) == 1) << endl; //output is 0 cout << ((0.7 + 0.1 + 0.2) == 1) << endl; //output is 1
Ce comportement déroutant découle de l'imprécision inhérente de nombres à virgule flottante. Lors de l'ajout de plusieurs nombres, l'ordre dans lequel les additions sont effectuées peut conduire à des résultats légèrement différents en raison d'erreurs d'arrondi.
L'article fondateur « Ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante » clarifie ce problème :
"Une autre zone grise concerne l'interprétation des parenthèses. En raison d'erreurs d'arrondi, les lois associatives de l'algèbre ne s'appliquent pas nécessairement aux nombres à virgule flottante. Par exemple, le l'expression (x y) z a une réponse totalement différente de x (y z) lorsque x = 1e30, y = -1e30 et z = 1 (c'est 1 dans le premier cas, 0 dans le second). Par conséquent, il faut être prudent lorsqu’on s’appuie sur l’associativité de l’addition à virgule flottante. L'ordre dans lequel les opérandes sont ajoutés peut modifier subtilement le résultat, entraînant des comportements inattendus.
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!