0

Visualizzatore di float IEEE‑754

Guarda esattamente come un numero decimale viene memorizzato come float IEEE‑754 — bit di segno, bit dell'esponente e bit della mantissa — e perché numeri come 0,1 non sono memorizzati in modo esatto.

🔒 Elaborato interamente nel tuo browser: nulla di ciò che inserisci qui verrà mai caricato.

Elaborazione... 0%
Normalizzazione
Calcolo del bias dell'esponente
Espansione dei bit della mantissa
Fatto

Risultato

Ogni numero in virgola mobile che un computer memorizza — un numero JavaScript, un float C, un float Python — è codificato allo stesso modo secondo lo standard IEEE 754: un bit di segno, un blocco di bit per l'esponente e un blocco di bit per la mantissa (parte frazionaria). La precisione singola (32 bit) usa 1 bit di segno, 8 bit per l'esponente e 23 bit per la mantissa; la doppia precisione (64 bit), il formato alla base del tipo numerico predefinito di quasi ogni linguaggio, usa 1 bit di segno, 11 bit per l'esponente e 52 bit per la mantissa. Questo strumento prende qualsiasi numero decimale tu inserisca, lo codifica in entrambe le larghezze usando il codificatore float nativo del browser (DataView/ArrayBuffer) — lo stesso meccanismo su cui gira il tuo codice — e colora ogni bit in base alla regione a cui appartiene.

La codifica segue tre passaggi e questo strumento li percorre tutti, invece di mostrare solo i bit finali. Primo, normalizzazione: il numero viene riscritto come 1.mantissa × 2^esponente, con esattamente una cifra diversa da zero prima del punto binario (i numeri troppo piccoli ricevono invece il trattamento subnormale, senza 1 implicito iniziale). Secondo, bias dell'esponente: poiché il campo esponente deve memorizzare esponenti sia positivi sia negativi come numero senza segno, si aggiunge un bias fisso (127 per la precisione singola, 1023 per la doppia) prima di scrivere il campo in binario. Terzo, la mantissa frazionaria viene espansa bit per bit con il classico metodo «moltiplica per due, prendi la parte intera come bit successivo, conserva il resto» — ripetuto finché il campo mantissa è pieno; a quel punto i bit rimanenti decidono se arrotondare per eccesso o per difetto (arrotondamento al pari, il default IEEE‑754).

Questo è esattamente il motivo per cui un numero comune come 0,1 non viene memorizzato in modo esatto. In binario, 0,1 è una frazione periodica (0,0001100110011…, all'infinito), quindi nessuna mantissa finita può contenerlo con precisione — da qualche parte deve essere arrotondato. Codifica 0,1 come float a 32 bit e riconverti i bit: non ottieni indietro 0,1, ma esattamente 0,100000001490116119384765625. La doppia precisione ha a disposizione 29 bit di mantissa in più, quindi il suo errore di arrotondamento è molto più piccolo, ma non è zero — 0,1 come double a 64 bit è esattamente 0,1000000000000000055511151231257827021181583404541015625. Questo strumento calcola quel valore esatto memorizzato con aritmetica a interi grandi (nessuna scorciatoia in virgola mobile), così il divario tra ciò che hai digitato e ciò che l'hardware conserva davvero non viene mai nascosto né approssimato.

I valori speciali ricevono pattern di bit esatti e riservati, invece di una codifica normale: zero e zero negativo hanno esponente e mantissa tutti a zero (cambia solo il bit di segno), ±Infinito ha i bit dell'esponente tutti a uno e mantissa tutta a zero, e NaN ha i bit dell'esponente tutti a uno e almeno un bit della mantissa impostato. Qui tutto gira localmente nel tuo browser — niente di ciò che digiti viene caricato da qualche parte — il che rende questo un luogo sicuro per costruire un'intuizione reale sui bug della virgola mobile: perché `0.1 + 0.2 !== 0.3` in quasi tutti i linguaggi di programmazione, perché le texture float32 nel codice grafico perdono precisione che float64 non perderebbe, e perché il codice finanziario dovrebbe generalmente evitare del tutto la virgola mobile binaria.