Virgule flottante

Entrez un nombre décimal. Les étapes ci-dessous détaillent la conversion telle que vous la feriez sur le papier. La ligne du haut montre ce que l'ordinateur conserve finalement en mémoire.

Chargement de la simulation interactive...
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.

Huit sur mille 🖖

Parmi les nombres de 0,001 à 1,000, exactement huit sont mémorisés sans la moindre erreur : 0,125, 0,25, 0,375, 0,5, 0,625, 0,75, 0,875 et 1. Une fraction binaire est une somme de demis, de quarts, de huitièmes, et ainsi de suite. Le dénominateur 1000 porte en lui un facteur 125 qu'aucune puissance de deux ne pourra jamais éliminer. Entrez 0,375 et l'outil considère cette valeur comme exacte. Entrez 0,376 et ce n'est plus le cas.

0,1 + 0,2 tombe exactement au milieu 🖖

Les deux valeurs enregistrées s'additionnent pour donner 0,3000000000000000166533453693773481063544750213623046875. Cela correspond au point médian précis entre les deux doubles situés de part et d'autre de 0,3. L'addition en elle-même est irréprochable. Il faut pourtant trancher l'égalité, et la règle exige de retenir le voisin dont le dernier bit est pair. Le double inférieur à 0,3 termine sa fraction sur un bit impair, tandis que le double supérieur s'achève sur un bit pair. La somme est donc poussée vers le haut. C'est ce qui explique les dernières décimales de 0,30000000000000004.

Moins de bits, bonne réponse 🖖

Appuyez sur binary32 avec ces deux mêmes nombres. 0,1 + 0,2 donne 0,300000011920928955078125, ce qui est exactement la valeur stockée pour 0,3 dans ce format. La célèbre erreur nécessite que la somme tombe sur une égalité parfaite. Sur 24 bits, elle échoue à un quart d'écart d'une telle égalité, et s'arrondit donc au nombre que vous attendiez. La précision est divisée par deux, mais vous obtenez la réponse voulue.

L'écart double à chaque puissance de deux 🖖

N'importe où entre 0,0625 et 0,125, la distance d'un nombre représentable au suivant est de 1,39 × 10⁻¹⁷, et elle ne varie pas du tout sur cette plage. Passez à la plage supérieure et cette distance double. L'escalier du graphique illustre exactement ce phénomène, avec une marche par puissance de deux. C'est pourquoi le même format peut conserver 10⁻³⁰⁰ et 10³⁰⁰ sans pour autant pouvoir conserver 9007199254740993.

Problème entièrement résolu

  1. 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.

    1. 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.

    2. 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.

    3. 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.

    4. 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.

    5. Le résultat renvoyé est donc 0,3000000000000000444089209850062616169452667236328125, et tout calcul ultérieur le transporte.

    6. 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.

Exemples de problèmes

  • 0,1 - 0,1 est conservé sous la forme 0,1000000000000000055511151231257827021181583404541015625, et 0,2 est surestimé du double. Leur somme tombe très exactement au milieu des deux nombres entourant 0,3. La règle de départage décide alors de la direction, et l'arrondi se fait vers le haut.
  • 0,375 - La ligne en base deux s'arrête après trois chiffres au lieu de se poursuivre indéfiniment. L'outil qualifie alors la valeur d'exacte. Le nombre 0,375 vaut 3/8, et les fractions binaires se composent précisément de huitièmes. Changez le dernier chiffre en 0,376 et le développement ne s'arrêtera jamais.
  • 0,1 en 32 bits - Le même 0,1 avec 24 bits de mantisse au lieu de 53 : il est conservé sous la valeur 0,100000001490116119384765625, et l'outil indique 7,22 chiffres décimaux. Ajoutez 0,2 ici et la réponse est 0,300000011920928955078125, ce qui correspond exactement à la façon dont 0,3 est enregistré dans ce format.
  • 2⁵³ + 1 - Au-delà de 2⁵³, l'écart atteint 2, de sorte qu'un nombre entier sur deux est absent. 9007199254740993 se situe exactement entre deux d'entre eux et la règle de départage le rabaisse à 9007199254740992, soit une erreur de −1. Y ajouter 1 ne change rien, pour cette même raison.
  • 10¹⁶ + 1 - 10¹⁶ est conservé exactement, tout comme 1, et 10¹⁶ + 1 donne 10¹⁶. L'écart est ici de 2, donc 10000000000000001 est à égalité entre deux voisins. La règle du dernier bit pair, qui avait poussé 0,1 + 0,2 vers le haut, ramène celui-ci vers le bas.