Pourquoi ne l'ajout de 0,1 à plusieurs reprises restent sans perte?

Je sais que le 0.1 nombre décimal ne peut pas être représenté exactement avec un nombre fini de nombres binaires (explication), de sorte double n = 0.1 perd un peu de précision et ne sera pas exactement 0.1. D'autre part 0.5 peut être représenté exactement parce que c'est 0.5 = 1/2 = 0.1b.

Cela dit, il est compréhensible que l'ajout de 0.1 trois fois ne donnera pas exactement 0.3 donc le code suivant imprime false:

double sum = 0, d = 0.1;
for (int i = 0; i < 3; i++)
    sum += d;
System.out.println(sum == 0.3); //Prints false, OK

Mais alors, comment est-ce que l'ajout de 0.1 cinq fois donneront exactement 0.5? Le code suivant imprime true:

double sum = 0, d = 0.1;
for (int i = 0; i < 5; i++)
    sum += d;
System.out.println(sum == 0.5); //Prints true, WHY?

Si 0.1 ne peut pas être représenté exactement, comment est-ce que l'ajout de 5 fois donne exactement 0.5 qui peut être représenté précisément?

Si vous avez vraiment de la recherche, je suis sûr que vous pouvez comprendre, mais à virgule flottante est chargé avec des "surprises", et parfois, il est préférable de simplement regarder dans l'émerveillement.
Vous pensez à ce sujet dans une mathy. Virgule flottante aritmetics n'est pas des maths en aucune façon.
c'est très beaucoup de la mauvaise attitude à avoir.
même si elle a été optimisé de loin, ce ne serait qu'une optimisation valide si sum avait la même valeur, c'est comme si la boucle était réellement exécutées. Dans la norme C++ ce qui est appelé le "comme-si la règle" ou "même les comportements observables".
pas vrai du tout. L'arithmétique en virgule flottante est rigoureusement définis, avec un bon traitement mathématique de l'erreur de limites et de ces. C'est juste que beaucoup de programmeurs ne sont pas prêts à le suivre à travers sur l'analyse, ou qu'ils croient, à tort, que "floating-point est inexact" est tout ce qu'il faut savoir et que l'analyse n'est pas la peine de s'embêter avec.

OriginalL'auteur icza | 2014-09-30