L'addition en virgule flottante est elle non commutative ou non associative

Lundi, on a lancé Trajectoires Podcast, «le podcast de la culture mathématique». Et Laura, chroniqueuse, dit que l'addition des floats, des représentations informatiques des nombres à virgules flottante, n'est pas associative. Il parait même que c'est ce qu'elle a toujours entendu dire dans son laboratoire.

J'aimerai revenir sur ce point précis, plus en détail que ce que j'ai dit à l'oral, quand je n'avais pas eu le temps d'y réfléchir. Mais d'abord je redonne un exemple.

Ainsi, la somme 1+0.000000000000000000000000000001+ (-1), calculé de gauche à droite, va donner 0, parce que le résultat intermédiaire 1+0.000000000000000000000000000001 aura été arrondi à 1. Par contre, si on inversait l'ordre des nombres, et qu'on prenait 1+(-1)+0.000000000000000000000000000001, ça donnera bien 0.000000000000000000000000000001. En effet le résultat intermédiaire 1+(-1)=0 a été arrondi à 0.

Et bien, je suis désolé, mais mathématiquement, c'est l'associativité qui est en cause. Pour le voir, il suffit de rajouter les parenthèse implicite. Notre deuxième calcul est (1+(-1))+0.000000000000000000000000000001. Mais si on avait fait le calcul 1+((-1)+0.000000000000000000000000000001), le résultat intermédiaire serait -1, et donc le résultat final serait 0. Et vous pouvez remarquer ici que seul l'associativité indique que les deux calculs donneraient le même résultat.

Mon explication

Je pense que ce qui est caché, quand on parle de la commutativé, c'est que les opérations ne sont pas commutatives. Remarquez que c'est trivial, si on commence par dire «bonjour $PRENOM» et seulement ensuite: «Quel est ton prénom ?
% :- »
Clairement, le programme va bugger.

Mais avec l'addition, cette intuition nous a été caché. Le bon moyen de donner du sens à ce qu'on appelle la commutativité de la somme, ici, se voit de la manière suivante. Prenons une liste L de nombre. Pour faire la somme des éléments de L, on initialise une variable V à 0, on fait une boucle sur les éléments E de L. Pour chaque élément E, on fait V:=V+E. Pour faire plus algébriste, on peut simplement dire que on considère que les floats sont un monoïde[1], et qu'on considère leur action à droite sur les floats. Et qu'on effectue toutes les actions à droites, successivement, à l'élément neutre du monoide, c'est à dire à 0.

Et c'est ces opérations informatiques de la forme V:=V+E qui ne commutent pas. Mathématiquement, c'est l'ordre dans lequel on effectue les actions à droite qui ne commute pas. Autrement dit, on ne peut pas commuter impunément les éléments de L. Mais tout ça n'a plus rien à voir avec la commutativité de l'opération binaire qu'est l'addition et tout à voir avec la commutativité des instructions informatique/application du monoïde.

Conclusion

Pour finir, si je me trompe et que effectivement l'addition des floats n'est pas commutative, ça sera super simple à montrer. Il suffit de donner deux floats x et y tel que x+y n'est pas égal à y+x. Et SEULEMENT deux nombres, montrer la commutativité n'a pas besoin de plus.

P.S.:
Comme me l'a signalé un-e ami-e, j'ai fait dans ma chronique exactement la même bêtise que celle que je signalais à Laura. En effet, quand je dis «commutativité», c'est faux, l'associativité était aussi nécessaire vu qu'il y a 4 personnes.

P.P.S:
Wikipedia dit la même chose que moi.

Note

[1] On a le droit, si l'on suppose que les floats sont associatif.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet