Visualiseur de flottants IEEE-754
Voyez exactement comment un nombre décimal est stocké en tant que flottant IEEE-754 — bit de signe, bits d'exposant et bits de mantisse — et pourquoi des nombres comme 0,1 ne sont pas stockés exactement.
🔒 Entièrement traité dans votre navigateur — rien de ce que vous saisissez ici n'est jamais téléchargé.
Résultat
Chaque nombre à virgule flottante stocké par un ordinateur — un nombre JavaScript, un float C, un float Python — est encodé de la même manière selon la norme IEEE 754 : un bit de signe, un bloc de bits d'exposant et un bloc de bits de mantisse (la fraction). La simple précision (32 bits) utilise 1 bit de signe, 8 bits d'exposant et 23 bits de mantisse ; la double précision (64 bits), le format sous-jacent au type numérique par défaut de presque tous les langages, utilise 1 bit de signe, 11 bits d'exposant et 52 bits de mantisse. Cet outil prend le nombre décimal que vous saisissez, l'encode dans l'une ou l'autre largeur en s'appuyant sur l'encodeur flottant DataView/ArrayBuffer du navigateur — la même machinerie sur laquelle votre code s'exécute réellement — et colorie chaque bit selon la zone à laquelle il appartient.
L'encodage lui-même suit trois étapes, et cet outil les parcourt toutes au lieu de se contenter d'afficher les bits finaux. Premièrement, la normalisation : le nombre est réécrit sous la forme 1,mantisse × 2^exposant, avec exactement un chiffre non nul avant la virgule binaire (les nombres trop petits pour cela reçoivent le traitement dénormalisé, sans 1 implicite). Deuxièmement, le biais d'exposant : comme le champ exposant doit stocker à la fois des exposants positifs et négatifs en tant que nombre non signé, un biais fixe (127 en simple précision, 1023 en double) est ajouté avant que le champ soit écrit en binaire. Troisièmement, la mantisse fractionnaire est développée bit par bit avec la méthode classique « multiplier par deux, prendre la partie entière comme bit suivant, garder le reste » — répétée jusqu'à ce que le champ mantisse soit plein, moment où les bits restants déterminent si le résultat est arrondi vers le haut ou vers le bas (arrondi au pair le plus proche, le mode par défaut d'IEEE-754).
C'est exactement pourquoi un nombre aussi ordinaire que 0,1 n'est pas stocké exactement. En binaire, 0,1 est une fraction périodique (0,0001100110011…, à l'infini), donc aucune mantisse de taille finie ne peut le contenir avec précision — il doit forcément être arrondi quelque part. Encodez 0,1 comme un flottant 32 bits et relisez les bits : vous ne récupérez pas 0,1, mais exactement 0,100000001490116119384765625. La double précision dispose de 29 bits de mantisse supplémentaires, donc son erreur d'arrondi est bien plus faible, mais elle n'est pas nulle pour autant — 0,1 en double 64 bits est exactement 0,1000000000000000055511151231257827021181583404541015625. Cet outil calcule cette valeur exacte stockée à l'aide d'une arithmétique sur grands entiers (sans raccourcis flottants) afin que l'écart entre ce que vous avez tapé et ce que le matériel conserve réellement ne soit jamais caché ni approximé.
Les valeurs spéciales reçoivent des motifs binaires réservés et non un encodage normal : zéro et zéro négatif ont tous leurs bits d'exposant et de mantisse à zéro (seul le bit de signe diffère), ±Infini a tous ses bits d'exposant à un et une mantisse entièrement à zéro, et NaN a tous ses bits d'exposant à un avec au moins un bit de mantisse à un. Tout s'exécute localement dans votre navigateur — rien de ce que vous tapez n'est envoyé où que ce soit — ce qui en fait un endroit sûr pour développer une véritable intuition des bogues liés aux flottants : pourquoi `0.1 + 0.2 !== 0.3` dans presque tous les langages, pourquoi les textures float32 dans le code graphique perdent une précision que le float64 éviterait, et pourquoi le code financier devrait généralement éviter les flottants binaires.