Skip to content

Convertisseur IEEE 754 virgule flottante

Convertissez vos flottants décimaux en binaire et hex IEEE 754 — demi, simple, double précision et bfloat16. Valeur stockée exacte, erreur d'arrondi et disposition des bits. 100 % dans votre navigateur.

Sans pistage Fonctionne dans le navigateur Gratuit
Tout s'exécute localement dans votre navigateur — les valeurs que vous tapez ne quittent jamais cet appareil.
Format
Valeurs spéciales
Disposition des bits — cliquez sur un bit pour l'inverser
Signe Exposant Mantisse
Décomposition des champs
Signe
Exposant
Mantisse
Valeur stockée et erreur d'arrondi
Vous avez saisi
Réellement stocké
Erreur d'arrondi
Valeurs représentables voisines
Précédente
Suivante
ULP (taille de l'écart)
Paramètres des formats IEEE 754 en un coup d'œil
Format Bits totaux Signe Exposant Mantisse Biais Valeur finie max Chiffres décimaux
binary16 (FP16)1615101565504~3.3
bfloat1616187127≈3.39×10³⁸~2.3
binary32 (FP32)321823127≈3.40×10³⁸~7.2
binary64 (FP64)64111521023≈1.80×10³⁰⁸~15.9
Relu pour l'exactitude numérique par rapport aux définitions de formats IEEE 754-2019 ; chaque valeur d'exemple vérifiée par arithmétique exacte sur grands entiers — Équipe d'ingénierie Go-Tools · 16 juil. 2026

Qu'est-ce que la virgule flottante IEEE 754 ?

IEEE 754 est la norme qui définit comment les ordinateurs stockent les nombres réels en binaire. Chaque valeur est empaquetée dans trois champs : un bit de signe, un exposant (stocké avec un biais afin de représenter aussi bien les grandes magnitudes que les minuscules) et une mantisse contenant les chiffres significatifs. Presque tous les CPU, GPU et langages de programmation l'utilisent, ce qui explique pourquoi les mêmes surprises d'arrondi apparaissent aussi bien en JavaScript qu'en Python, en C ou en SQL.

L'idée clé est que la virgule flottante binaire ne peut représenter que des nombres de la forme m × 2ⁿ. Les fractions décimales comme 0.1 sont des fractions binaires infinies périodiques — 0.000110011001100… — donc le format stocke à la place le voisin représentable le plus proche. En simple précision, ce voisin est 0.100000001490116119384765625 ; en double précision, c'est 0.1000000000000000055511151231257827021181583404541015625. Aucun des deux n'est 0.1. Toutes les bizarreries en aval — 0.1 + 0.2 ≠ 0.3, des sommes qui dérivent, des tests d'égalité qui échouent — découlent de ce seul fait, et ce convertisseur le rend visible en imprimant la valeur stockée exacte plutôt qu'une approximation ré-arrondie.

La norme réserve aussi des motifs de bits pour les valeurs spéciales. Un exposant tout à un encode ±Infinity (mantisse nulle) ou NaN (mantisse non nulle) ; un exposant tout à zéro encode le zéro signé (mantisse nulle) ou les nombres subnormaux (mantisse non nulle), qui comblent l'écart d'underflow près de zéro à précision réduite. Les quatre formats couverts par cet outil — binary16/FP16, bfloat16, binary32/FP32, binary64/FP64 — ne diffèrent que par le nombre de bits attribués à chaque champ : plus de bits d'exposant signifie plus d'étendue, plus de bits de mantisse signifie plus de précision. bfloat16, le favori du machine learning, est simplement un FP32 dont on a coupé les 16 bits de mantisse du bas : même étendue, précision beaucoup plus grossière.

Un modèle mental utile : les flottants représentables forment une grille sur la droite numérique dont l'espacement — une unité à la dernière place, ou ULP — double à chaque puissance de deux. Près de 1.0, l'espacement de la grille d'un double est d'environ 2.22 × 10⁻¹⁶ ; près de 2⁵³, il vaut un entier complet, raison pour laquelle les doubles ne peuvent pas compter de façon fiable au-delà de 2⁵³. Le panneau des voisins de cet outil montre cette grille directement : les valeurs représentables précédente et suivante autour de ce que vous tapez, avec l'écart exact entre elles.

// Float ↔ hex through the raw IEEE 754 bits (works in any browser / Node.js)
const buf = new DataView(new ArrayBuffer(8));

function floatToHex32(value) {
  buf.setFloat32(0, value); // rounds to nearest even
  return '0x' + buf.getUint32(0).toString(16).toUpperCase().padStart(8, '0');
}

function hexToFloat32(hex) {
  buf.setUint32(0, parseInt(hex, 16));
  return buf.getFloat32(0);
}

floatToHex32(0.1);        // '0x3DCCCCCD'
floatToHex32(3.14159);    // '0x40490FD0'
hexToFloat32('3DCCCCCD'); // 0.10000000149011612

Fonctionnalités clés

Quatre formats, une seule vue

Demi (FP16), bfloat16, Simple (FP32) et Double (FP64) — changez d'un clic et toute la page se recalcule : comparer comment le même nombre atterrit dans chaque format ne prend que quelques secondes.

Grille de bits cliquable

Chaque bit est un bouton. Inversez le signe, ajustez l'exposant ou touchez un bit de mantisse et regardez les vues décimale, hexadécimale et binaire se mettre à jour instantanément — le moyen le plus rapide de développer une intuition de l'encodage.

Valeur stockée exacte, pas une approximation

L'outil calcule l'expansion décimale complète des bits stockés avec une arithmétique exacte sur grands entiers — les 55 chiffres du 0.1 d'un double — plus l'erreur d'arrondi signée exacte par rapport à votre saisie.

Voisins et ULP

Voyez les valeurs représentables précédente et suivante autour du nombre courant et l'écart exact (ULP) entre elles — l'espacement de grille qui détermine la précision dont vous disposez réellement à une magnitude donnée.

Valeurs spéciales en un clic

Des puces chargent ±0, ±Infinity, NaN, le plus petit subnormal et la plus grande valeur finie du format sélectionné, avec le badge de classification qui nomme ce que le motif de bits courant encode.

Permaliens partageables, zéro téléversement

Copier le lien encode le format et le motif de bits exact dans l'URL — idéal pour les rapports de bug, les revues de code et l'enseignement. Tout s'exécute dans votre navigateur ; rien de ce que vous tapez ne quitte la page.

Exemples de conversion IEEE 754

0.1 en simple précision — l'erreur d'arrondi classique

0.1
0x3DCCCCCD — stocké en réalité comme 0.100000001490116119384765625

Le décimal 0.1 n'a pas de représentation binaire finie, donc IEEE 754 stocke à la place la valeur représentable la plus proche. En simple précision (FP32), c'est 0x3DCCCCCD, soit exactement 0.100000001490116119384765625 — environ 1.49 × 10⁻⁹ de trop. L'outil affiche cette valeur stockée exacte et l'erreur exacte, chiffre par chiffre, plutôt que le « 0.1 » arrondi que votre langage de programmation vous renvoie. Ce seul exemple explique la plupart des surprises en virgule flottante, y compris pourquoi 0.1 + 0.2 n'est pas égal à 0.3.

Flottant vers hex : 3.14159 en FP32

3.14159
0x40490FD0

Tapez 3.14159 avec Simple (FP32) sélectionné et le champ hex affiche 0x40490FD0 — signe 0, exposant biaisé 128 (donc 2¹), mantisse 0x490FD0. La valeur réellement stockée est 3.141590118408203125, un cheveu au-dessus de votre saisie. La forme hexadécimale est celle que vous rencontrez dans les captures réseau, les buffers GPU, les vues de registres et les fichiers binaires sérialisés, et la conversion fonctionne dans les deux sens : collez 40490FD0 dans le champ hex pour la décoder.

Maximum FP16 : 65504, la limite de la demi-précision

65504
0x7BFF — la plus grande valeur finie en FP16

La demi-précision ne dispose que de 5 bits d'exposant et 10 bits de mantisse, donc sa plus grande valeur finie est 65504 (0x7BFF). Tapez 65520 ou n'importe quelle valeur supérieure et le résultat s'arrondit à Infinity (0x7C00) — un vrai danger lors de la quantification de modèles de machine learning en FP16. Passez en bfloat16 et le même 65520 tient sans problème, car bfloat16 conserve les 8 bits d'exposant de FP32 (l'étendue) en sacrifiant des bits de mantisse (la précision). Ce compromis est exactement la raison pour laquelle l'entraînement ML privilégie bfloat16 tandis que le stockage compact privilégie FP16.

−0 et +0 : deux motifs de bits différents, une seule valeur

-0
0x80000000 (FP32), tandis que +0 vaut 0x00000000

IEEE 754 possède un zéro signé : −0 n'active que le bit de signe (0x80000000 en FP32), tandis que +0 est entièrement à zéro. Ils sont égaux dans tous les langages, pourtant 1/−0 vaut −Infinity et 1/+0 vaut +Infinity : la différence est donc observable. Cliquez sur le bit de signe dans l'outil pour basculer entre les deux et regardez le badge de classification rester sur Zéro pendant que l'hex change — une illustration en un clic de la différence entre égalité au niveau des bits et égalité numérique.

Comment convertir des nombres IEEE 754 en virgule flottante

  1. 1

    Choisissez un format en virgule flottante

    Simple (FP32) est présélectionné. Passez en Double (FP64) pour les nombres de type JavaScript/Python, ou en Demi (FP16) et bfloat16 pour les formats 16 bits utilisés en machine learning et en graphisme.

  2. 2

    Saisissez un nombre décimal

    Entrez n'importe quelle valeur — 0.1, -2.5e3, 65504 — ou utilisez les puces de valeurs spéciales pour ±0, ±Infinity, NaN, le plus petit subnormal et la plus grande valeur finie. La conversion se fait pendant la frappe.

  3. 3

    Lisez la disposition des bits codée par couleur

    Le bit de signe, le champ d'exposant et la mantisse sont surlignés dans des couleurs différentes, et le tableau de décomposition des champs montre les bits bruts, le calcul du biais et le bit de tête implicite.

  4. 4

    Vérifiez la valeur stockée exacte et l'erreur

    Le panneau de précision imprime la valeur réellement stockée — chaque chiffre, calculé exactement — à côté de l'erreur d'arrondi par rapport à votre saisie, plus les voisins représentables précédent et suivant et l'écart en ULP.

  5. 5

    Inversez des bits, collez de l'hex, copiez les résultats

    Cliquez sur n'importe quel bit pour l'inverser, ou collez des chaînes hexadécimales (3DCCCCCD) et binaires pour les décoder en décimal. Copiez l'hex, le binaire, la valeur exacte ou un lien partageable qui reproduit le motif de bits exact.

Erreurs courantes en virgule flottante

Faire confiance à la valeur affichée plutôt qu'à la valeur stockée

Les langages affichent les flottants arrondis à la chaîne la plus courte qui fait l'aller-retour, donc 0.1 paraît propre alors que la valeur stockée ne l'est pas. Jugez la précision d'après l'expansion exacte, pas d'après ce que print() montre.

✗ Incorrect
print(0.1)  # 0.1 — paraît exact, ne l'est pas
✓ Correct
0.1 stocké (FP64) = 0.1000000000000000055511151231257827021181583404541015625

Comparer des flottants pour une égalité exacte

0.1 + 0.2 atterrit sur le motif de bits 0x3FD3333333333334 tandis que le littéral 0.3 vaut 0x3FD3333333333333 — un ULP d'écart, donc == est faux même si les deux s'affichent comme des valeurs proches de 0.3.

✗ Incorrect
if (0.1 + 0.2 === 0.3) { … }   // ne s'exécute jamais
✓ Correct
if (Math.abs(a - b) < 1e-9) { … }   // tolérance adaptée à vos données

Quantifier en FP16 sans vérifier l'étendue

La plus grande valeur finie de FP16 est 65504. Tout ce qui est plus grand devient Infinity, et une fois qu'un Infinity entre dans un calcul, il se propage. Vérifiez vos maxima avant de convertir vers le bas — ou utilisez bfloat16, qui conserve l'étendue de FP32.

✗ Incorrect
fp16(65520)   → Infinity (0x7C00) — débordement silencieux
✓ Correct
bf16(65520)   → fini (bfloat16 conserve 8 bits d'exposant)

Tester NaN avec l'égalité

NaN est la seule valeur qui n'est pas égale à elle-même — c'est voulu, pour qu'un calcul échoué ne puisse pas se faire passer pour un nombre réel. Utilisez le test isNaN de votre langage plutôt que ==, et rappelez-vous qu'il existe des millions de motifs de bits NaN distincts.

✗ Incorrect
if (x === NaN) { … }        // toujours faux, même quand x EST NaN
✓ Correct
if (Number.isNaN(x)) { … }  // le test correct

Ce que vous pouvez faire avec le convertisseur IEEE 754

Déboguer des données binaires sérialisées
Collez l'hex trouvé dans une capture réseau, un buffer GPU, un dump de registres ou un format de fichier et décodez-le vers la valeur décimale exacte — ou faites l'inverse pour écrire des fixtures de test. Note sur l'ordre des octets : l'hex affiché est le motif de bits big-endian ; si votre dump est en little-endian, inversez l'ordre des octets avant de coller.
Comprendre la quantification ML
Vérifiez si vos valeurs survivent au plafond de 65504 de FP16, comparez chiffre par chiffre la perte de précision entre FP16 et bfloat16, et inspectez la plage subnormale où les gradients passent en underflow.
Expliquer un bug de virgule flottante
Quand un collègue demande pourquoi deux nombres « égaux » diffèrent, envoyez un permalien montrant les deux motifs de bits et les valeurs stockées exactes — le débat se règle de lui-même. Associez-le à l'outil de comparaison de texte pour les dumps plus longs.
Apprendre ou enseigner l'encodage
Les cours d'architecture des ordinateurs deviennent concrets quand les étudiants peuvent cliquer sur les bits d'exposant et voir le calcul du biais se mettre à jour. Le tableau de décomposition des champs reflète la façon dont les manuels dessinent le format.
Décoder des registres embarqués et industriels
Les trames Modbus, CAN et les charges utiles de capteurs transportent couramment des valeurs FP32 sous forme de mots hexadécimaux bruts. Collez le mot ici pour lire la valeur physique sans écrire de script jetable.

Formats IEEE 754 et valeurs spéciales

Les quatre formats binaires en un coup d'œil
binary16 (FP16) : 1 bit de signe + 5 bits d'exposant + 10 bits de mantisse, biais 15, max 65504, ~3.3 chiffres décimaux. bfloat16 : 1 + 8 + 7, biais 127, max ≈ 3.39 × 10³⁸, ~2.3 chiffres. binary32 (FP32) : 1 + 8 + 23, biais 127, max ≈ 3.40 × 10³⁸, ~7.2 chiffres. binary64 (FP64) : 1 + 11 + 52, biais 1023, max ≈ 1.80 × 10³⁰⁸, ~15.9 chiffres. Le schéma : les bits d'exposant achètent de l'étendue, les bits de mantisse achètent de la précision, et bfloat16 échange délibérément toute sa précision contre l'étendue de FP32.
Comment une valeur est assemblée
Un nombre normal se décode comme (−1)^signe × 1.mantisse × 2^(exposant − biais). Le 1 de tête est implicite — il n'est pas stocké, c'est pourquoi un champ de mantisse de 23 bits fournit 24 bits de précision. L'exposant stocké est l'exposant réel plus le biais (127 en FP32), donc 2⁰ est stocké comme 01111111. Le tableau de décomposition des champs de cet outil montre chaque étape de ce calcul pour la valeur courante.
Valeurs spéciales : les motifs d'exposant réservés
Exposant tout à un avec mantisse nulle : ±Infinity ; avec n'importe quelle mantisse non nulle : NaN (le NaN silencieux canonique active le bit de poids fort de la mantisse). Exposant tout à zéro avec mantisse nulle : ±0 ; avec une mantisse non nulle : un subnormal, décodé comme 0.mantisse × 2^(1 − biais) — sans 1 de tête implicite. Ces règles sont identiques dans les quatre formats, c'est pourquoi les mêmes puces fonctionnent dans chacun.
Arrondi : au plus proche, égalité vers le pair
Quand une valeur tombe entre deux nombres représentables, le mode par défaut d'IEEE 754 arrondit vers le plus proche ; en cas d'égalité exacte, il choisit celui dont le dernier bit de mantisse est 0 (égalité vers le pair), ce qui évite toute dérive systématique. Ce convertisseur applique exactement cette règle en réduisant votre saisie décimale vers le format cible, et le panneau d'erreur montre exactement la différence signée résultante.
ULP : l'espacement de la grille des flottants
Les flottants représentables ne sont pas répartis uniformément — l'écart entre voisins (une unité à la dernière place) double à chaque puissance de deux. Près de 1.0, l'ULP d'un double vaut 2⁻⁵² ≈ 2.22 × 10⁻¹⁶ ; près de 2⁵³, l'ULP atteint 1.0 et les entiers commencent à sauter. Le panneau des voisins imprime l'ULP courant exactement — la réponse honnête à « quelle est la précision de mon nombre ici ? ».

Bonnes pratiques en virgule flottante

Ne comparez jamais des flottants avec ==
Après n'importe quelle arithmétique, deux expressions mathématiquement égales peuvent se retrouver à un ULP l'une de l'autre. Comparez avec une tolérance adaptée à vos ordres de grandeur — ou comptez les ULP entre les motifs de bits, que cet outil vous laisse inspecter directement.
Tenez l'argent à l'écart des flottants binaires
Aucune grille en puissances de deux ne contient 0.10 exactement, donc une devise stockée en flottants accumule des erreurs visibles. Utilisez des centimes entiers ou un type décimal ; le panneau de valeur stockée exacte de cet outil en est la preuve permanente.
Choisissez le format 16 bits selon l'étendue, pas l'habitude
Si vos valeurs peuvent dépasser 65504 — pertes, gradients, pics physiques — FP16 débordera vers Infinity là où bfloat16 continue sans broncher. Si tout est normalisé dans une bande étroite, les bits de mantisse supplémentaires de FP16 donnent une précision visiblement meilleure.
Attention au piège du double arrondi lors du rétrécissement
Convertir décimal → double → demi peut atterrir à un ULP du résultat de la conversion directe décimal → demi dans de rares cas limites. Cet outil arrondit votre saisie décimale vers le format cible en une seule étape, donc ce que vous voyez est la réponse IEEE 754 honnête.
Attendez-vous à ce que les entiers cassent au-delà de 2⁵³
Un double stocke exactement chaque entier jusqu'à 2⁵³, puis commence à en sauter — 2⁵³ + 1 n'est pas représentable. Si vous manipulez des identifiants ou des compteurs proches de cette échelle, utilisez des entiers 64 bits ou des chaînes, et vérifiez ici les valeurs suspectes au niveau du bit.

FAQ du convertisseur IEEE 754

Pourquoi 0.1 + 0.2 n'est-il pas égal à 0.3 ?
Parce qu'aucun de ces trois nombres n'existe en virgule flottante binaire. Un double stocke 0.1 comme exactement 0.1000000000000000055511151231257827021181583404541015625 et 0.2 avec un excès minuscule similaire ; leur addition donne 0.3000000000000000444089209850062616169452667236328125 (bits 0x3FD3333333333334), tandis que le littéral 0.3 s'arrondit à 0.299999999999999988897769753748434595763683319091796875 (bits 0x3FD3333333333333). La somme atterrit un pas représentable au-dessus du littéral — deux motifs de bits différents — donc 0.1 + 0.2 == 0.3 est faux dans tous les langages IEEE 754 : JavaScript, Python, Java, C, Rust, Go. Tapez 0.1 dans ce convertisseur et lisez la valeur stockée exacte pour constater la cause profonde de vos propres yeux.
Qu'est-ce que IEEE 754 ?
IEEE 754 est la norme technique de l'arithmétique binaire en virgule flottante utilisée par pratiquement tous les CPU, GPU et langages de programmation modernes. Elle définit comment un nombre est empaqueté en bits — un bit de signe, un champ d'exposant et une mantisse (significande) — ainsi que les règles d'arrondi et les valeurs spéciales Infinity, NaN, zéro signé et nombres subnormaux. Les formats que vous rencontrerez en pratique sont binary32 (float, FP32), binary64 (double, FP64), binary16 (half, FP16) et la troncature apparentée bfloat16 utilisée en machine learning. Ce convertisseur montre les quatre au niveau du bit.
Quelle est la différence entre FP16 et bfloat16 ?
Les deux sont des formats 16 bits, mais ils répartissent leurs bits différemment. FP16 (IEEE binary16) utilise 5 bits d'exposant et 10 bits de mantisse : plus de précision, mais une étendue minuscule — la plus grande valeur finie est 65504, donc le débordement vers Infinity est un danger permanent. bfloat16 conserve les 8 bits d'exposant de FP32 et seulement 7 bits de mantisse : toute l'étendue ±3.4 × 10³⁸ d'un float, avec une précision bien plus grossière. C'est pourquoi l'entraînement ML, où les gradients peuvent grimper bien au-delà de 65504, s'est standardisé sur bfloat16, tandis que FP16 convient au stockage et à l'inférence où les valeurs restent maîtrisées. Comparez-les ici : tapez 0.1 et changez de format — FP16 stocke 0.0999755859375 (0x2E66), bfloat16 stocke 0.10009765625 (0x3DCD).
Que sont les nombres subnormaux (dénormalisés) ?
Quand le champ d'exposant est entièrement à zéro, IEEE 754 abandonne le 1 de tête implicite et laisse la mantisse décroître progressivement vers zéro — ce sont les nombres subnormaux (ancien terme : dénormalisés). Ils comblent l'écart entre zéro et le plus petit nombre normal, de sorte que la différence de deux flottants inégaux ne peut jamais s'arrondir à zéro (underflow progressif). Le coût : une précision réduite et, sur de nombreux CPU, une arithmétique plus lente. En FP16, le plus petit subnormal est 2⁻²⁴ = 0.000000059604644775390625 ; cliquez sur la puce Min subnormal dans n'importe quel format pour inspecter son motif de bits — bits d'exposant tous à zéro, mantisse 0…001.
Dois-je utiliser float ou double ?
Utilisez double (FP64) par défaut, sauf raison mesurée de faire autrement. Un double porte environ 15–16 chiffres décimaux significatifs contre à peu près 7 pour un float, et la plupart des langages (les nombres JavaScript, les floats Python) ne connaissent de toute façon que le double. Choisissez float (FP32) quand la bande passante mémoire ou le stockage domine — grands tableaux, pipelines GPU, graphisme — et que vous avez confirmé que 7 chiffres suffisent. Pour l'argent, utilisez des entiers (centimes) ou un type décimal : aucun format binaire ne stocke 0.1 exactement, comme le démontre le panneau de valeur stockée de cet outil. Si vous devez plutôt inspecter des bases entières, voyez le convertisseur de base numérique.
Comment convertir un flottant en hexadécimal à la main ?
Prenez le signe (0 pour positif, 1 pour négatif). Écrivez la valeur absolue en binaire et normalisez-la sous la forme 1.xxx × 2ⁿ. Ajoutez le biais du format à n (127 pour FP32, 1023 pour FP64) et écrivez le résultat dans les bits d'exposant. Supprimez le 1 de tête et gardez les 23 (ou 52) bits suivants de la fraction comme mantisse, en arrondissant au pair le plus proche à la coupure. Concaténez signe, exposant, mantisse et groupez chaque paquet de 4 bits en un chiffre hexadécimal. Pour 3.14159 en FP32, cela donne 0 | 10000000 | 10010010000111111010000 → 0x40490FD0 — ou épargnez-vous le calcul et laissez ce convertisseur rendre chaque étape visible.
Mes données sont-elles envoyées quelque part quand j'utilise ce convertisseur ?
Non. Chaque conversion s'exécute localement dans votre navigateur en JavaScript pur — arithmétique DataView et BigInt, aucun aller-retour serveur, aucune bibliothèque tierce. Vous pouvez ouvrir les outils de développement de votre navigateur, constater que le panneau réseau reste silencieux pendant que vous tapez, ou vous déconnecter complètement d'internet et continuer à convertir. Le bouton Copier le lien encode le motif de bits dans le fragment d'URL, qui n'est lui non plus jamais envoyé à aucun serveur.