Skip to content

Convertitore IEEE 754 per Numeri in Virgola Mobile

Converti float in binario e hex IEEE 754 online: FP16, FP32, FP64 e bfloat16. Valore memorizzato esatto, errore di arrotondamento e bit, 100% nel browser.

Niente tracciamento Funziona nel browser Gratuito
Tutto viene eseguito localmente nel tuo browser — i valori che digiti non lasciano mai questo dispositivo.
Formato
Valori speciali
Layout dei bit — clicca su qualsiasi bit per invertirlo
Segno Esponente Mantissa
Scomposizione dei campi
Segno
Esponente
Mantissa
Valore memorizzato ed errore di arrotondamento
Hai inserito
Effettivamente memorizzato
Errore di arrotondamento
Valori rappresentabili vicini
Precedente
Successivo
ULP (dimensione del gap)
Parametri dei formati IEEE 754 a colpo d'occhio
Formato Bit totali Segno Esponente Mantissa Bias Valore finito massimo Cifre decimali
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
Revisionato per accuratezza numerica rispetto alle definizioni dei formati IEEE 754-2019; ogni valore di esempio verificato con aritmetica esatta a interi grandi — Team di Ingegneria Go Tools · Jul 16, 2026

Cos'è la Virgola Mobile IEEE 754?

IEEE 754 è lo standard che definisce come i computer memorizzano i numeri reali in binario. Ogni valore è impacchettato in tre campi: un bit di segno, un esponente (memorizzato con un bias così da poter rappresentare sia grandezze enormi che minuscole) e una mantissa che contiene le cifre significative. Quasi ogni CPU, GPU e linguaggio di programmazione lo usa, ed è per questo che le stesse sorprese di arrotondamento compaiono allo stesso modo in JavaScript, Python, C e SQL.

L'intuizione chiave è che la virgola mobile binaria può rappresentare solo numeri della forma m × 2ⁿ. Le frazioni decimali come 0.1 sono frazioni periodiche infinite in base 2 — 0.000110011001100… — quindi il formato memorizza al loro posto il vicino rappresentabile più prossimo. In precisione singola quel vicino è 0.100000001490116119384765625; in precisione doppia è 0.1000000000000000055511151231257827021181583404541015625. Nessuno dei due è 0.1. Ogni stranezza a valle — 0.1 + 0.2 ≠ 0.3, somme che derivano, controlli di uguaglianza che falliscono — discende da questo singolo fatto, e questo convertitore lo rende visibile stampando il valore memorizzato esatto invece di un'approssimazione riarrotondata.

Lo standard riserva inoltre alcuni pattern di bit per i valori speciali. Un esponente tutto a uno codifica ±Infinity (mantissa zero) o NaN (mantissa diversa da zero); un esponente tutto a zero codifica lo zero con segno (mantissa zero) o i numeri subnormali (mantissa diversa da zero), che riempiono il divario di underflow accanto allo zero a precisione ridotta. I quattro formati coperti da questo strumento — binary16/FP16, bfloat16, binary32/FP32, binary64/FP64 — differiscono solo per quanti bit assegnano a ciascun campo: più bit di esponente significano più intervallo, più bit di mantissa significano più precisione. bfloat16, il preferito del machine learning, è semplicemente FP32 con i 16 bit inferiori di mantissa tagliati via: stesso intervallo, precisione molto più grossolana.

Un modello mentale utile è che i float rappresentabili formano una griglia sulla retta dei numeri il cui passo — una unità nell'ultima posizione, o ULP — raddoppia a ogni potenza di due. Vicino a 1.0 il passo della griglia di un double è circa 2.22 × 10⁻¹⁶; vicino a 2⁵³ è un intero, ed è per questo che i double non possono contare in modo affidabile oltre 2⁵³. Il pannello dei vicini di questo strumento mostra quella griglia direttamente: i valori rappresentabili precedente e successivo attorno a qualsiasi numero digiti, con il gap esatto tra loro.

// 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

Caratteristiche Principali

Quattro formati, una sola vista

Mezza (FP16), bfloat16, Singola (FP32) e Doppia (FP64) — cambia con un clic e l'intera pagina viene ricalcolata, così confrontare come lo stesso numero atterra in ciascun formato richiede pochi secondi.

Griglia di bit cliccabile

Ogni bit è un pulsante. Inverti il segno, ritocca l'esponente o modifica un bit di mantissa e osserva le viste decimale, esadecimale e binaria aggiornarsi all'istante — il modo più rapido per costruirsi un'intuizione della codifica.

Valore memorizzato esatto, non un'approssimazione

Lo strumento calcola l'espansione decimale completa dei bit memorizzati con aritmetica esatta a interi grandi — tutte le 55 cifre dello 0.1 di un double — più l'errore di arrotondamento esatto con segno rispetto a ciò che hai digitato.

Vicini e ULP

Vedi i valori rappresentabili precedente e successivo attorno al numero corrente e il gap esatto (ULP) tra loro — il passo della griglia che determina quanta precisione hai davvero a una data grandezza.

Valori speciali a portata di clic

I chip caricano ±0, ±Infinity, NaN, il più piccolo subnormale e il più grande valore finito del formato selezionato, con il badge di classificazione che indica cosa codifica il pattern di bit corrente.

Permalink condivisibili, zero upload

Copia link codifica il formato e l'esatto pattern di bit nell'URL — ideale per bug report, code review e didattica. Tutto viene eseguito nel tuo browser; nulla di ciò che digiti lascia la pagina.

Esempi di Conversione IEEE 754

0.1 in precisione singola — il classico errore di arrotondamento

0.1
0x3DCCCCCD — memorizzato in realtà come 0.100000001490116119384765625

Il decimale 0.1 non ha una rappresentazione binaria finita, quindi IEEE 754 memorizza al suo posto il valore rappresentabile più vicino. In precisione singola (FP32) quel valore è 0x3DCCCCCD, cioè esattamente 0.100000001490116119384765625 — circa 1.49 × 10⁻⁹ in eccesso. Lo strumento mostra questo valore memorizzato esatto e l'errore esatto, cifra per cifra, invece dello '0.1' arrotondato che il tuo linguaggio di programmazione ti ristampa. Questo singolo esempio spiega la maggior parte delle sorprese in virgola mobile, incluso perché 0.1 + 0.2 non è uguale a 0.3.

Da float a hex: 3.14159 in FP32

3.14159
0x40490FD0

Digita 3.14159 con Singola (FP32) selezionata e il campo hex mostra 0x40490FD0 — segno 0, esponente con bias 128 (quindi 2¹), mantissa 0x490FD0. Il valore effettivamente memorizzato è 3.141590118408203125, appena sopra quello che hai digitato. La forma esadecimale è quella che vedi nei dump di rete, nei buffer GPU, nelle viste dei registri e nei file binari serializzati, e la conversione funziona in entrambe le direzioni: incolla 40490FD0 nel campo hex per decodificarlo.

Massimo FP16: 65504 è dove finisce la mezza precisione

65504
0x7BFF — il più grande valore FP16 finito

La mezza precisione ha solo 5 bit di esponente e 10 bit di mantissa, quindi il suo più grande valore finito è 65504 (0x7BFF). Digita 65520 o un valore più grande e il risultato viene arrotondato a Infinity (0x7C00) — un rischio reale quando quantizzi modelli di machine learning in FP16. Passa a bfloat16 e lo stesso 65520 ci sta comodamente, perché bfloat16 conserva gli 8 bit di esponente di FP32 (intervallo) rinunciando a bit di mantissa (precisione). Questo compromesso è esattamente il motivo per cui il training ML preferisce bfloat16 mentre l'archiviazione compatta preferisce FP16.

−0 e +0: due pattern di bit diversi, un solo valore

-0
0x80000000 (FP32), mentre +0 è 0x00000000

IEEE 754 ha uno zero con segno: −0 imposta solo il bit di segno (0x80000000 in FP32), mentre +0 è tutto zeri. Risultano uguali in ogni linguaggio, eppure 1/−0 è −Infinity e 1/+0 è +Infinity, quindi la differenza è osservabile. Clicca sul bit di segno nello strumento per passare dall'uno all'altro e osserva il badge di classificazione restare su Zero mentre l'hex cambia — un'illustrazione in un solo clic del perché l'uguaglianza a livello di bit e l'uguaglianza numerica sono cose diverse.

Come Convertire Numeri IEEE 754 in Virgola Mobile

  1. 1

    Scegli un formato in virgola mobile

    Singola (FP32) è preselezionata. Passa a Doppia (FP64) per numeri in stile JavaScript/Python, oppure a Mezza (FP16) e bfloat16 per i formati a 16 bit usati nel machine learning e nella grafica.

  2. 2

    Digita un numero decimale

    Inserisci qualsiasi valore — 0.1, -2.5e3, 65504 — oppure usa i chip dei valori speciali per ±0, ±Infinity, NaN, il più piccolo subnormale e il più grande valore finito. La conversione avviene mentre digiti.

  3. 3

    Leggi il layout dei bit codificato per colore

    Il bit di segno, il campo esponente e la mantissa sono evidenziati in colori diversi, con la tabella di scomposizione dei campi che mostra i bit grezzi, l'aritmetica del bias e il bit iniziale implicito.

  4. 4

    Controlla il valore memorizzato esatto e l'errore

    Il pannello di precisione stampa il valore effettivamente memorizzato — ogni cifra, calcolata in modo esatto — accanto all'errore di arrotondamento rispetto a ciò che hai digitato, oltre ai valori rappresentabili precedente e successivo e al gap in ULP.

  5. 5

    Inverti bit, incolla hex, copia i risultati

    Clicca su qualsiasi bit per invertirlo, oppure incolla stringhe hex (3DCCCCCD) e binarie per decodificarle di nuovo in decimale. Copia l'hex, il binario, il valore esatto o un link condivisibile che riproduce l'esatto pattern di bit.

Errori Comuni in Virgola Mobile

Fidarsi del valore stampato invece di quello memorizzato

I linguaggi stampano i float arrotondati alla stringa più corta che sopravvive al round-trip, quindi 0.1 sembra pulito mentre il valore memorizzato non lo è. Giudica la precisione dall'espansione esatta, non da ciò che mostra print().

✗ Errato
print(0.1)  # 0.1 — sembra esatto, non lo è
✓ Corretto
0.1 memorizzato (FP64) = 0.1000000000000000055511151231257827021181583404541015625

Confrontare i float per uguaglianza esatta

0.1 + 0.2 atterra sul pattern di bit 0x3FD3333333333334 mentre il letterale 0.3 è 0x3FD3333333333333 — a un ULP di distanza, quindi == è falso anche se entrambi si stampano come valori vicini a 0.3.

✗ Errato
if (0.1 + 0.2 === 0.3) { … }   // non viene mai eseguito
✓ Corretto
if (Math.abs(a - b) < 1e-9) { … }   // tolleranza dimensionata sui tuoi dati

Quantizzare in FP16 senza controllare l'intervallo

Il più grande valore finito di FP16 è 65504. Qualsiasi valore più grande diventa Infinity, e una volta che un Infinity entra in un calcolo si propaga. Controlla i tuoi massimi prima del cast verso il basso — oppure usa bfloat16, che conserva l'intervallo di FP32.

✗ Errato
fp16(65520)   → Infinity (0x7C00) — overflow silenzioso
✓ Corretto
bf16(65520)   → finito (bfloat16 conserva 8 bit di esponente)

Testare NaN con l'uguaglianza

NaN è l'unico valore che non è uguale a sé stesso — è così per progettazione, in modo che un calcolo fallito non possa mascherarsi da numero reale. Usa il controllo isNaN del tuo linguaggio invece di ==, e ricorda che esistono milioni di pattern di bit NaN distinti.

✗ Errato
if (x === NaN) { … }        // sempre falso, anche quando x È NaN
✓ Corretto
if (Number.isNaN(x)) { … }  // il test corretto

Cosa Puoi Fare con il Convertitore IEEE 754

Debug di dati binari serializzati
Incolla l'hex trovato in una cattura di rete, un buffer GPU, un dump di registri o un formato di file e decodificalo nel valore decimale esatto — o procedi nell'altro senso per scrivere fixture di test. Nota sull'ordine dei byte: l'hex mostrato è il pattern di bit big-endian; se il tuo dump è little-endian, inverti l'ordine dei byte prima di incollare.
Capire la quantizzazione ML
Verifica se i tuoi valori sopravvivono al tetto di 65504 di FP16, confronta cifra per cifra la perdita di precisione tra FP16 e bfloat16 e ispeziona l'intervallo subnormale dove i gradienti vanno in underflow.
Spiegare un bug di virgola mobile
Quando un collega chiede perché due numeri 'uguali' differiscono, invia un permalink che mostra entrambi i pattern di bit e i valori memorizzati esatti — la discussione si risolve da sola. Abbinalo allo strumento di confronto testi per dump più lunghi.
Imparare o insegnare la codifica
I corsi di architettura dei calcolatori diventano concreti quando gli studenti possono cliccare sui bit dell'esponente e osservare l'aritmetica del bias aggiornarsi. La tabella di scomposizione dei campi rispecchia il modo in cui i libri di testo disegnano il formato.
Decodificare registri embedded e industriali
I payload Modbus, CAN e dei sensori trasportano abitualmente valori FP32 come word esadecimali grezze. Incolla qui la word per leggere il valore fisico senza scrivere uno script usa e getta.

Formati IEEE 754 e Valori Speciali

I quattro formati binari a colpo d'occhio
binary16 (FP16): 1 bit di segno + 5 di esponente + 10 di mantissa, bias 15, massimo 65504, ~3.3 cifre decimali. bfloat16: 1 + 8 + 7, bias 127, massimo ≈ 3.39 × 10³⁸, ~2.3 cifre. binary32 (FP32): 1 + 8 + 23, bias 127, massimo ≈ 3.40 × 10³⁸, ~7.2 cifre. binary64 (FP64): 1 + 11 + 52, bias 1023, massimo ≈ 1.80 × 10³⁰⁸, ~15.9 cifre. Lo schema: i bit di esponente comprano intervallo, i bit di mantissa comprano precisione, e bfloat16 scambia deliberatamente tutta la sua precisione per l'intervallo di FP32.
Come viene assemblato un valore
Un numero normale si decodifica come (−1)^segno × 1.mantissa × 2^(esponente − bias). L'1 iniziale è implicito — non viene memorizzato, ed è per questo che un campo mantissa a 23 bit fornisce 24 bit di precisione. L'esponente memorizzato è l'esponente vero più il bias (127 in FP32), quindi 2⁰ è memorizzato come 01111111. La tabella di scomposizione dei campi in questo strumento mostra ogni passaggio di quell'aritmetica per il valore corrente.
Valori speciali: i pattern di esponente riservati
Esponente tutto a uno con mantissa zero è ±Infinity; con qualsiasi mantissa diversa da zero è NaN (il NaN quiet canonico imposta il bit più alto della mantissa). Esponente tutto a zero con mantissa zero è ±0; con mantissa diversa da zero è un subnormale, decodificato come 0.mantissa × 2^(1 − bias) — senza 1 iniziale implicito. Queste regole sono identiche in tutti e quattro i formati, ed è per questo che gli stessi chip funzionano in ciascuno.
Arrotondamento: al più vicino, pareggi al pari
Quando un valore cade tra due numeri rappresentabili, la modalità predefinita di IEEE 754 arrotonda al più vicino; in caso di pareggio esatto sceglie quello il cui ultimo bit di mantissa è 0 (pareggi al pari), il che previene derive sistematiche. Questo convertitore applica esattamente quella regola quando restringe il tuo input decimale nel formato di destinazione, e il pannello dell'errore mostra esattamente la differenza con segno risultante.
ULP: il passo della griglia dei float
I float rappresentabili non sono distribuiti in modo uniforme — il gap tra vicini (una unità nell'ultima posizione) raddoppia a ogni potenza di due. Vicino a 1.0 l'ULP di un double è 2⁻⁵² ≈ 2.22 × 10⁻¹⁶; vicino a 2⁵³ l'ULP raggiunge 1.0 e gli interi iniziano a saltare. Il pannello dei vicini stampa l'ULP corrente in modo esatto, che è la risposta onesta a 'quanto è preciso il mio numero qui?'.

Best Practice per la Virgola Mobile

Non confrontare mai i float con ==
Dopo qualsiasi operazione aritmetica, due espressioni matematicamente uguali possono trovarsi a un ULP di distanza. Confronta rispetto a una tolleranza adeguata alle tue grandezze — oppure conta gli ULP tra i pattern di bit, che questo strumento ti permette di ispezionare direttamente.
Tieni il denaro fuori dai float binari
Nessuna griglia in potenze di due contiene 0.10 esattamente, quindi la valuta nei float accumula errori visibili. Usa centesimi interi o un tipo decimale; il pannello del valore memorizzato esatto qui è la prova permanente del perché.
Scegli il formato a 16 bit in base all'intervallo, non all'abitudine
Se i tuoi valori possono superare 65504 — loss, gradienti, picchi nelle simulazioni fisiche — FP16 andrà in overflow a Infinity dove bfloat16 prosegue tranquillo. Se tutto è normalizzato in una banda stretta, i bit di mantissa extra di FP16 danno una precisione visibilmente migliore.
Attenzione alla trappola del doppio arrotondamento quando restringi
Convertire decimale → double → half può atterrare a un ULP di distanza dal convertire decimale → half direttamente, in rari casi a metà strada. Questo strumento arrotonda il tuo input decimale nel formato di destinazione in un solo passaggio, quindi ciò che vedi è la risposta IEEE 754 onesta.
Aspettati che gli interi si rompano oltre 2⁵³
Un double memorizza esattamente ogni intero fino a 2⁵³, poi inizia a saltare — 2⁵³ + 1 non è rappresentabile. Se gestisci ID o contatori vicino a quella scala, usa interi a 64 bit o stringhe, e controlla qui i valori sospetti a livello di bit.

Domande Frequenti sul Convertitore IEEE 754

Perché 0.1 + 0.2 non è uguale a 0.3?
Perché nessuno dei tre numeri esiste in virgola mobile binaria. Un double memorizza 0.1 esattamente come 0.1000000000000000055511151231257827021181583404541015625 e 0.2 con un piccolo eccesso simile; sommandoli si ottiene 0.3000000000000000444089209850062616169452667236328125 (bit 0x3FD3333333333334), mentre il letterale 0.3 viene arrotondato a 0.299999999999999988897769753748434595763683319091796875 (bit 0x3FD3333333333333). La somma cade un passo rappresentabile sopra il letterale — due pattern di bit diversi — quindi 0.1 + 0.2 == 0.3 è falso in ogni linguaggio IEEE 754: JavaScript, Python, Java, C, Rust, Go. Digita 0.1 in questo convertitore e leggi il valore memorizzato esatto per vedere la causa con i tuoi occhi.
Cos'è IEEE 754?
IEEE 754 è lo standard tecnico per l'aritmetica binaria in virgola mobile usato praticamente da ogni CPU, GPU e linguaggio di programmazione moderno. Definisce come un numero viene impacchettato nei bit — un bit di segno, un campo esponente e una mantissa (significando) — oltre alle regole di arrotondamento e ai valori speciali Infinity, NaN, zero con segno e numeri subnormali. I formati che incontrerai nella pratica sono binary32 (float, FP32), binary64 (double, FP64), binary16 (half, FP16) e il correlato troncamento bfloat16 usato nel machine learning. Questo convertitore mostra tutti e quattro a livello di bit.
Qual è la differenza tra FP16 e bfloat16?
Entrambi sono formati a 16 bit, ma suddividono i bit in modo diverso. FP16 (IEEE binary16) usa 5 bit di esponente e 10 bit di mantissa: più precisione, ma un intervallo minuscolo — il più grande valore finito è 65504, quindi l'overflow a Infinity è un rischio costante. bfloat16 conserva gli 8 bit di esponente di FP32 e solo 7 bit di mantissa: l'intero intervallo ±3.4 × 10³⁸ di un float, con una precisione molto più grossolana. Ecco perché il training ML, dove i gradienti possono superare di molto 65504, si è standardizzato su bfloat16, mentre FP16 si adatta ad archiviazione e inferenza dove i valori sono sotto controllo. Confrontali qui: digita 0.1 e cambia formato — FP16 memorizza 0.0999755859375 (0x2E66), bfloat16 memorizza 0.10009765625 (0x3DCD).
Cosa sono i numeri subnormali (denormali)?
Quando il campo esponente è tutto zeri, IEEE 754 elimina l'1 iniziale implicito e lascia che la mantissa si riduca gradualmente verso lo zero — questi sono i numeri subnormali (termine più vecchio: denormali). Riempiono il divario tra lo zero e il più piccolo numero normale, così la differenza di due float diversi non può mai essere arrotondata a zero (underflow graduale). Il costo è una precisione ridotta e, su molte CPU, un'aritmetica più lenta. In FP16 il più piccolo subnormale è 2⁻²⁴ = 0.000000059604644775390625; clicca sul chip Min subnormale in qualsiasi formato per ispezionarne il pattern di bit — bit di esponente tutti a zero, mantissa 0…001.
Dovrei usare float o double?
Usa double (FP64) come impostazione predefinita, a meno che tu non abbia una ragione misurata per fare diversamente. Un double offre circa 15–16 cifre decimali significative contro le circa 7 di un float, e la maggior parte dei linguaggi (i numeri di JavaScript, i float di Python) usa comunque solo double. Scegli float (FP32) quando dominano la larghezza di banda della memoria o l'archiviazione — grandi array, pipeline GPU, grafica — e hai verificato che 7 cifre bastano. Per il denaro usa interi (centesimi) o un tipo decimale: nessun formato binario memorizza 0.1 esattamente, come dimostra il pannello del valore memorizzato di questo strumento. Se invece devi ispezionare basi intere, vedi il convertitore di basi numeriche.
Come converto manualmente un float in hex?
Prendi il segno (0 per positivo, 1 per negativo). Scrivi il valore assoluto in binario e normalizzalo come 1.xxx × 2ⁿ. Aggiungi il bias del formato a n (127 per FP32, 1023 per FP64) e scrivilo nei bit dell'esponente. Elimina l'1 iniziale e conserva i successivi 23 (o 52) bit della frazione come mantissa, arrotondando al pari più vicino nel punto di taglio. Concatena segno, esponente e mantissa e raggruppa ogni 4 bit in una cifra esadecimale. Per 3.14159 in FP32 si ottiene 0 | 10000000 | 10010010000111111010000 → 0x40490FD0 — oppure salta l'aritmetica e lascia che questo convertitore mostri ogni passaggio.
I miei dati vengono caricati quando uso questo convertitore?
No. Ogni conversione viene eseguita localmente nel tuo browser con puro JavaScript — aritmetica DataView e BigInt, nessun round-trip verso un server, nessuna libreria di terze parti. Puoi aprire gli strumenti per sviluppatori del browser, osservare il pannello di rete restare silenzioso mentre digiti, oppure disconnetterti completamente da internet e continuare a convertire. Il pulsante Copia link codifica il pattern di bit nel fragment dell'URL, che allo stesso modo non viene mai inviato ad alcun server.

Strumenti correlati

Vedi tutti gli strumenti →