Différents résultats lors de l'utilisation de SUM et non?

Est-ce que quelqu'un sait pourquoi Excel donne différentes réponses à la même question lors de l'utilisation de la fonction SUM ou non?

Si vous tapez:

=0.1+0.1+0.1-0.3 

Vous obtenez une réponse différente (correcte) de 0 par rapport à:

 =SUM(0.1+0.1+0.1-0.3) 

Ce qui donne une réponse incorrecte de 5.55112E-17 .

Je comprends que Excel utilise l'IEEE 754 et cela explique pourquoi la seconde est désactivée, mais ce que j'aimerais savoir, c'est la façon dont les deux diffèrent, et qu'est-ce que le premier fait pour l'get correctement?

Ceci est tiré de la page Microsoft expliquant l'arithmétique à floating point:


Exemple lorsqu'une valeur atteint zéro

Dans Excel 95 ou antérieur, entrez le suivant dans un nouveau classur:

 A1: =1.333+1.225-1.333-1.225 

Cliquez avec le button droit de la souris sur la cellule A1, puis click Format des cellules. Dans l'onglet Numéro, click scientifique dans la catégorie. Réglez les cases décimales sur 15. Au lieu d'afficher 0, Excel 95 affiche -2.22044604925031E-16.

Excel 97, cependant, a introduit une optimization qui tente de corriger ce problème. Si une opération d'addition ou de soustraction entraîne une valeur à ou très proche de zéro, Excel 97 et versions ultérieures compenseront toute erreur introduite en raison de la conversion d'un opérande vers et depuis le binary. L'exemple ci-dessus lors de l'exécution dans Excel 97 et versions ultérieures affiche correctement 0 ou 0.000000000000000E + 00 en notation scientifique.


Il semble que l'optimization mentionnée dans le dernier paragraphe ne soit pas appliquée si les parenthèses sont incluses dans le calcul – peut-être que cela perturbe la séquence de calcul. Par exemple:

 =0.1+0.1+0.1-0.3 = 0 

Toutefois:

 =(0.1+0.1+0.1-0.3) = 5.551115123125780E-17 

Pourtant, la mauvaise calcul ne s'applique pas seulement à ces nombres entre parenthèses, mais aussi aux numéros à l'extérieur, à condition qu'il y ait des crochets dans la formule. Alors:

 =0.1+0.1+0.1-0.3+(0.1+0.1+0.1-0.3) = 1.110223024625160E-16 

Ce calcul donne deux fois l'erreur dans son calcul, même si la première partie n'est pas parenthèse.