Pourquoi 0,1 + 0,2 ne fait pas 0,3

La norme IEEE 754 écrit un nombre sous forme de signe, d'exposant et de mantisse, en base deux : valeur = (−1)^signe × 1,mantisse × 2^(exposant − biais). La simple précision a 8 bits d'exposant et 23 de mantisse, la double 11 et 52. C'est le format de presque tous les processeurs et de tous les langages de programmation.

En base deux, seules les fractions dont le dénominateur est une puissance de 2 ont une écriture finie. 0,5 et 0,25 oui, 0,1 non : en binaire c'est 0,000110011001100… périodique, qu'il faut tronquer. La valeur stockée est la plus proche disponible, soit 0,100000001490116… pour un float, et en additionnant des valeurs déjà approchées les erreurs s'accumulent.

C'est pourquoi on ne compare pas des flottants avec ==, mais en vérifiant que l'écart est petit, et qu'on compte l'argent en centimes entiers ou avec des types décimaux. Des valeurs spéciales complètent le format : zéro signé, infinis, NaN et les dénormalisés, qui comblent le vide près de zéro.

Erreurs fréquentes

  • Comparer deux flottants avec == : 0.1 + 0.2 == 0.3 est faux dans presque tous les langages.
  • Utiliser des flottants pour de l'argent : les arrondis s'additionnent. Mieux vaut des centimes entiers ou un type décimal.
  • Croire qu'un float 32 bits a 32 bits de précision : la mantisse en a 24, environ 7 chiffres décimaux ; un double en a environ 16.

Questions fréquentes

Combien de chiffres décimaux ont un float et un double ?

Un float 32 bits garantit environ 7 chiffres significatifs, un double 64 bits environ 15 à 16. Au-delà, les chiffres affichés reflètent l'approximation binaire.

Que sont les nombres dénormalisés ?

Ce sont les valeurs plus petites que le plus petit normal : l'exposant est entièrement nul et la mantisse perd son 1 implicite. Ils permettent d'approcher zéro progressivement, au prix de la précision.

Pourquoi existe-t-il +0 et −0 ?

Parce que le signe est un bit à part. Les deux zéros sont égaux à la comparaison, mais 1/+0 donne +∞ et 1/−0 donne −∞ : ils gardent le côté par lequel on a atteint zéro.

Comment fonctionne ce calcul

Valeur = (−1)^s × 1,f × 2^(e − biais) pour les nombres normaux, avec un biais de 127 en simple et 1023 en double précision ; pour les dénormalisés (e = 0), la valeur est (−1)^s × 0,f × 2^(1 − biais). Un exposant entièrement à 1 avec une mantisse nulle vaut ±∞, avec une mantisse non nulle NaN. La valeur exacte est calculée en décimal sans arrondi : tout float vaut m × 2^k, et pour k négatif cela vaut m × 5^(−k) ÷ 10^(−k).