personne n'a dit le lundi 10 juin 2013 |
Mauvaise allocation mémoire pour les flottants, il va pas aller loin le robot!^^ |
personne n'a dit le mardi 11 juin 2013 |
Une petite explication technique serait la bienvenue. |
personne n'a dit le mardi 11 juin 2013 |
double d1 = 0.1; double d2 = 0.2; double d = d1 + d2; // d = 0.30000000004 ou 0.29999999996 C'est du au fait qu'un double est codé en puissances de 2 et a donc une précision qui est de 1/2^n |
personne n'a dit le mardi 11 juin 2013 |
L'explication ci-dessus restant tout de même technique... Les "flottants" et "doubles" nommés dans les commentaires ci-dessus sont des formats de chiffres à virgules. Comme toutes les données informatiques, on peut les ramener à une suite de 0 et de 1... De fait, si l'on défini la partie décimale sur X bits, on aura une précision tout a fait relative. Par exemple, 8/9 + 1/9 ne donnera pas toujours 9/9 = 1 Mais peut, si l'informaticien ne fait pas attention, donner : 0.8888888.... + 0.111111.... = 0.9999999... |
personne n'a dit le mardi 11 juin 2013 |
Ah ouais quand même, on peut pas l'inventer celle-là. |
personne n'a dit le mercredi 12 juin 2013 |
0.2 et 0.1 sont des réels "finis" (je suis pas sur du terme) alors que 0.111111111111 non donc ton exemple ne correspond pas. Le problème vient bien du principe des float et double qui sont en puissances de 2. A contrario les nombres de type decimal (en puissance de 10) donnent un résultat exact (0,3). Je suis bien d'accord que ca reste technique et qu'il faut y avoir été confronté pour l'apprécier. |
personne n'a dit le mercredi 12 juin 2013 |
Un article ou c'est un peu mieux expliqué :) http://blog.octo.com/problemes-courants-imprecision-des-calculs-mathematiques-1ere-partie/ |