Perte de l'Associativité de la Multiplication





                    (3.10 * 2.30) * 1.50 = 10.695000 = 0x412B1EB8
                                                ####            #

est différent de :



                    3.10 * (2.30 * 1.50) = 10.694999 = 0x412B1EB7
                                                ####            #



Les calculs sont effectués en simple précision (c'est-à-dire sur 32 bits et ce afin de simplifier l'édition hexa-décimale des résultats) sur un PC Linux à l'aide du programme suivant (où la fonction 'MUL' est destinée à forcer l'ordre des multiplications) :



                    float     MUL(x,y)
                    float     x,y;
                              {
                              return(x*y);
                              }

main() { float A=3.1,B=2.3,C=1.5; float X,Y;
X=MUL(MUL(A,B),C); Y=MUL(A,MUL(B,C));
printf("\n (%f x %f) x %f = %f",A,B,C,X); printf("\n %f x (%f x %f) = %f",A,B,C,Y); }



Voici, au passage, un exemple de résultats obtenus en double précision (c'est-à-dire sur 64 bits) :



                    (3.11 * 2.30) * 1.50 = 10.729500000000000 = 0x402575810624DD2F
                                                 ############                    #

est différent de :



                    3.11 * (2.30 * 1.50) = 10.729499999999998 = 0x402575810624DD2E
                                                 ############                    #




Copyright (c) Jean-François Colonna, 2003-2014.
Copyright (c) France Telecom R&D and CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2003-2014.