Affichez 0.1 + 0.2 dans la plupart des langages de programmation et vous obtenez 0.30000000000000004. Rien n’est cassé : c’est ainsi que les ordinateurs stockent les nombres réels. Ce guide explique le format double précision IEEE 754 utilisé par SciKey et par la plupart des logiciels de calcul numérique, la manière dont ses limites se manifestent dans les résultats et la façon dont la calculatrice les gère.
1. La double précision IEEE 754
Un nombre en double précision (binary64) occupe 64 bits.
| Partie | Bits | Rôle |
|---|---|---|
| Signe | 1 | Positif ou négatif |
| Exposant | 11 | Quelle puissance de 2 |
| Mantisse | 52 | Chiffres significatifs (53 en pratique, avec un 1 de tête implicite) |
53 bits significatifs correspondent à environ 15 à 17 chiffres décimaux. La plus grande valeur représentable est d’environ 1.797×10³⁰⁸, et l’écart entre 1 et le nombre double suivant (l’epsilon machine) vaut 2⁻⁵² ≈ 2.22×10⁻¹⁶.
2. 0.1 n’a pas d’écriture binaire exacte
De même que 1/3 = 0.333… ne se termine jamais en décimal, 1/10 ne se termine jamais en binaire : 0.1 = 0.0001100110011…₂, développement périodique infini. Il est arrondi à 53 bits, si bien que la valeur stockée est en réalité
0.1000000000000000055511151231257827…
0.2 est lui aussi stocké légèrement par excès. Leur somme cumule les deux erreurs et vaut 0.3000000000000000444…, qui est un nombre double différent de celui qui stocke 0.3 (0.2999999999999999888…). Le plus court décimal identifiant la somme est donc 0.30000000000000004.
Pour la même raison, 0.1×3 donne aussi 0.30000000000000004. Les décimaux dont le dénominateur est une puissance de deux, comme 0.5, 0.25 et 0.375, sont exacts en binaire et ne portent aucune erreur.
3. Pourquoi la calculatrice affiche quand même 0.3
SciKey n’affiche pas la valeur interne brute : il l’arrondit au nombre de chiffres significatifs choisi (12 par défaut). Arrondi à 12 chiffres, 0.30000000000000004 donne 0.300000000000, soit 0.3. L’erreur se situe au 17ᵉ chiffre et n’atteint jamais l’écran.
Les calculatrices scientifiques de poche procèdent de même : elles calculent en général sur une quinzaine de chiffres internes et en affichent 10, masquant à l’affichage les infimes erreurs de fin. Seul l’affichage change : la valeur stockée reste 0.30000000000000004. La réutiliser dans d’autres calculs laisse en général des erreurs de l’ordre de 10⁻¹⁶, sans importance en pratique.
4. Pourquoi sin(π) n’est pas nul
En mode RAD, sin(π) devrait valoir exactement 0. Mais π est irrationnel, et le nombre double le plus proche de π est inférieur à la vraie valeur d’environ 1.22×10⁻¹⁶. Au voisinage de π, le sinus a une pente de −1, donc sin(π en double précision) ≈ 1.2246×10⁻¹⁶. Le sinus a été calculé correctement ; c’est l’entrée qui n’a jamais été exactement π.
SciKey corrige cela selon les règles suivantes :
- En modes DEG et GRAD, l’argument est réduit exactement modulo 360° (400 gon), et les multiples de 90° renvoient des valeurs exactes :
sin(180)= 0,cos(90)= 0, ettan(90)n’est pas défini, d’où une erreur. - En mode RAD, si l’argument correspond à un multiple entier de π avec une erreur relative inférieure à 10⁻¹³, sin renvoie 0 ; s’il correspond à un multiple impair de π/2, cos renvoie 0 et tan renvoie une erreur.
Ainsi, sin(π) affiche 0 dans SciKey. La correction ne s’applique qu’au voisinage des multiples de π et n’affecte aucun autre calcul.
5. Grands nombres : factorielles et dépassement de capacité
Les factorielles croissent vite. 170! ≈ 7.25741561531×10³⁰⁶ tient encore dans un double, mais 171! vaut environ 1.24×10³⁰⁹, au-delà du maximum de 1.797×10³⁰⁸. C’est pourquoi n! dans SciKey accepte les entiers de 0 à 170 et 171! renvoie une erreur de dépassement de capacité.
En pratique, les grandes factorielles apparaissent surtout dans des quotients. Le coefficient binomial C(200, 3) vaut 200!/(3!·197!), mais nCr(200, 3) = 1313400 le calcule directement, sans valeurs intermédiaires gigantesques. En probabilités, passer aux logarithmes et les additionner est une autre technique courante.
6. La limite des entiers : 2⁵³
Avec 53 bits significatifs, tous les entiers jusqu’à 2⁵³ = 9007199254740992 sont exacts. Au-delà, les doubles sautent des entiers. 2⁵³ + 1 n’est pas représentable et s’arrondit à 2⁵³, si bien que 2^53+1-2^53 donne 0 et non 1 : le 1 ajouté a disparu au stockage de la somme.
C’est pourquoi SciKey n’affiche le binaire, l’octal et l’hexadécimal que pour les entiers de valeur absolue au plus 2⁵³ ; au-delà, les chiffres de poids faible ne sont pas garantis. C’est aussi pourquoi des numéros de carte ou des identifiants de plus de 16 chiffres voient leurs derniers chiffres changer lorsqu’on les traite comme des nombres.
7. La cancellation catastrophique : l’erreur la plus dangereuse
Soustraire deux nombres presque égaux efface les premiers chiffres et ne laisse pratiquement que l’erreur. C’est ce qu’on appelle la cancellation catastrophique (ou annulation catastrophique).
Exemple 1. (1+1E-15)-1 devrait valoir 10⁻¹⁵, mais la double précision donne 1.11022302463×10⁻¹⁵. Le stockage de 1 + 10⁻¹⁵ introduit une erreur d’arrondi de l’ordre de 10⁻¹⁶ ; après soustraction de 1, cette erreur représente 11 % du résultat.
Exemple 2. Pour x = 10⁸, √(x²+1) − x vaut environ 5×10⁻⁹. En calcul direct, √(10¹⁶+1) est indiscernable de 10⁸ et le résultat vaut 0. Multiplier par la quantité conjuguée donne une forme équivalente sans soustraction :
√(x²+1) − x = 1 / (√(x²+1) + x)
Stockez 10⁸ dans x : 1/(sqrt(x^2+1)+x) renvoie 5×10⁻⁹ avec précision.
Exemple 3. 1 − cos(10⁻⁸) vaut environ 5×10⁻¹⁷, mais cos(10⁻⁸) s’arrondit exactement à 1 et le calcul direct donne 0. Avec l’identité 1 − cos x = 2 sin²(x/2), 2sin(0.5E-8)^2 donne 5×10⁻¹⁷ (mode RAD).
Aucun nombre de chiffres affichés n’y remédie. Il faut réécrire la formule.
8. Conseils pratiques
- Ne testez pas l’égalité exacte. Pour comparer deux résultats calculés, vérifiez si leur écart est suffisamment petit (par exemple une erreur relative de 10⁻¹²).
- Traitez l’argent en unités entières. Calculez dans la plus petite unité monétaire, en entiers, pour que les erreurs fractionnaires ne s’accumulent pas.
- Évitez de soustraire des nombres presque égaux. Utilisez la quantité conjuguée, des identités ou réorganisez le calcul pour supprimer la soustraction.
- Travaillez sur des rapports pour les grands nombres. Quand factorielles ou puissances explosent, utilisez nCr, les logarithmes ou simplifiez d’abord.
- N’arrondissez pas les résultats intermédiaires. L’erreur de la double précision est de l’ordre de 10⁻¹⁶, alors qu’arrondir à la main à quatre chiffres introduit des erreurs de l’ordre de 10⁻⁴. Les plus grosses erreurs viennent en général des humains, pas de la machine.
- Essayez d’afficher 15 chiffres. Si un résultat paraît étrange, affichez davantage de chiffres pour voir la valeur interne et distinguer une erreur sur les derniers chiffres d’une formule réellement fausse.