Leçon
La théorie — Virgule flottante299 mots
Un nombre à virgule flottante est un nombre entier multiplié par une puissance de deux : (−1)s × 1.f × 2E−1023. Le format détermine le nombre de bits alloués à E et à f. Cette unique répartition fixe à la fois la portée du format et la finesse avec laquelle il distingue deux nombres.
Ce que signifie chaque symbole
s- le bit de signe, 0 pour le positif et 1 pour le négatif. Il existe de façon indépendante au lieu d'être intégré au nombre. C'est pourquoi le format possède un +0 et un −0.
E- le champ de l'exposant. On lui ajoute 1023 pour qu'il puisse atteindre des valeurs négatives sans avoir besoin de son propre signe. Il choisit votre plage de travail, et c'est cette plage qui détermine l'écart entre des valeurs voisines.
f- la fraction : 52 bits qui suivent un 1 de tête qui n'est jamais stocké. Un nombre normalisé commence en effet toujours par un. Ces 52 bits apportent l'intégralité de la précision. L'exposant n'en ajoute aucune.
- Suppose
- Que le nombre soit fini et normalisé. En deçà de 2−1022, le 1 de tête disparaît. Le format se maintient alors en sacrifiant la précision. Le plus petit double positif vaut ainsi 4,94 × 10−324 et ne comporte qu'un unique bit de mantisse.
- Ne tient plus quand
- À deux endroits, tous deux rencontrés dans du code en production. Comparer deux valeurs calculées avec
=échoue chaque fois que vous les obtenez par des chemins distincts. Des calculs différents produisent des arrondis différents. De plus, une addition longue dépend de l'ordre de ses termes. Parcourez une liste à l'endroit puis à l'envers, les totaux différeront. Additionner d'abord les plus petits termes permet de perdre le moins de précision possible.
Problème entièrement résolu
-
Un système de paiement conserve des montants en livres sterling au format binary64. Démontrez que 0,10 £ et 0,20 £ sont tous deux stockés de manière légèrement excédentaire. Prouvez que leur somme ne donne pas 0,30 £. Expliquez enfin ce qu'un ingénieur en paiement fait pour y remédier.
-
En base deux, 0,1 s'écrit 0,0001 suivi de 1001 répété à l'infini. Un dixième requiert un cinq dans son dénominateur et une fraction binaire n'a que des deux. Son développement ne s'arrête donc jamais.
-
53 chiffres binaires sont conservés. Le reste est éliminé par l'arrondi. Ce dernier s'effectue ici vers le haut : la valeur mémorisée dépasse donc 0,1 de 5,55 × 10⁻¹⁸. L'étape d'arrondi sur la page vous indique cette direction par une flèche.
-
Le nombre 0,2 utilise ces mêmes 53 chiffres avec un exposant supérieur de un. Son erreur est donc exactement le double : 1,11 × 10⁻¹⁷. Saisissez 0,2 dans la case et comparez les deux fiches d'erreur.
-
Une fois additionnées, les deux valeurs stockées tombent exactement sur le point médian entre les deux doubles encadrant 0,3. En cas d'égalité, on choisit le voisin qui se termine par un bit pair. Il s'agit ici de celui du dessus.
-
Le résultat renvoyé est donc 0,3000000000000000444089209850062616169452667236328125, et tout calcul ultérieur le transporte.
-
Tapez maintenant 10 et 20 au lieu de 0,1 et 0,2. Ce sont deux nombres entiers largement inférieurs à 2⁵³. Ils sont tous deux conservés de manière exacte, et 10 + 20 donne 30 sans la moindre perte.
Réponse
Conservez la monnaie sous forme de nombre entier dans la plus petite unité, en pence plutôt qu'en livres. L'arithmétique devient alors exacte, car chaque entier jusqu'à 2⁵³ l'est. Le seul arrondi qui subsiste est celui que vous écrivez vous-même, au moment de votre choix, là où vous pouvez le pointer du doigt. L'outil vous montre ces deux aspects en dix secondes. Tapez 0,1 et la fiche d'erreur n'est pas à zéro. Tapez 10 et elle l'est.
-