Moué, bienvenue dans le monde merveilleux des calculs flottants. Ton problème est dû à une perte de précision et une mauvaise méthode d'arrondie, plus particulièrement dans cette expression :
Code :
nombre = nombre - result[i] * pow(10,i);
|
C'est d'autant plus la merde que même si tu regardes dans un débuggeur / ajoute des printf() un peu partout, tu ne verras sans doute aucun problème.
Ton problème vient néanmoins du fait que pow() renvoie un double, qui promouvera toute l'expression avec des calculs flottants. Ces calculs flottants seront fait par le FPU, qui utilise une plus grande précision que les doubles (80bits au lieu de 64).
Lorsque j'essaie avec le nombre 123456, l'expression devient :
Code :
- 123456 - 1 * pow(10, 5) = 0xfcffffffffff3fb70d40
|
(Le résultat est imprimé en hexa, parce que je n'ai pas trouvé de méthode fiable pour imprimer la valeur exacte d'un "long double" ). La série de fffffff semble indiquer que la valeur n'est pas exacte. Valeur qui est arrondie lorsque convertie en double (0x0000000000e8d640), on voit que la mantisse contient une valeur exacte. Ça veut dire qu'en interne le résultat de cette expression est probablement 23455.999999999999999999999, arrondie par défaut donc 23455.
Assez technique comme problème, et absolument pas intuitif. Deux façons de corriger ça :
- Utilise la fonction round(), du style: nombre = round(nombre - result[i] * pow(10,i));
- Utilise des calculs entiers (conseillé). Va falloir changer légèrement la logique, mais rien de dramatique.