0

IEEE-754 Float Visualisator

Zie precies hoe een decimaal getal wordt opgeslagen als een IEEE-754 float — tekenbit, exponentbits en mantissebits — en waarom getallen zoals 0,1 niet exact worden opgeslagen.

🔒 Wordt volledig in uw browser verwerkt. Niets wat u hier invoert, wordt ooit geüpload.

Verwerken... 0%
Normaliseren
Exponentbias berekenen
Mantissebits uitbreiden
Klaar

Resultaat

Elk floating-point getal dat een computer opslaat — een JavaScript-nummer, een C-float, een Python-float — wordt op dezelfde manier gecodeerd volgens IEEE 754: één tekenbit, een blok exponentbits en een blok mantissebits (fractie). Enkele precisie (32-bit) gebruikt 1 tekenbit, 8 exponentbits en 23 mantissebits; dubbele precisie (64-bit), het formaat achter bijna elk standaard getaltype in programmeertalen, gebruikt 1 tekenbit, 11 exponentbits en 52 mantissebits. Deze tool neemt elk decimaal getal dat je invoert, codeert het in beide breedtes met de eigen DataView/ArrayBuffer float-encoder van de browser — dezelfde machinerie waar jouw code daadwerkelijk op draait — en kleurt elke bit op basis van het gebied waartoe het behoort.

De codering zelf volgt drie stappen, en deze tool doorloopt ze allemaal in plaats van alleen de uiteindelijke bits te tonen. Ten eerste normalisatie: het getal wordt herschreven als 1,mantisse × 2^exponent, met precies één cijfer ongelijk aan nul voor de binaire komma (getallen die daarvoor te klein zijn krijgen in plaats daarvan de subnormale behandeling, zonder impliciete leidende 1). Ten tweede exponentbias: omdat het exponentveld zowel positieve als negatieve exponenten moet opslaan als een niet-ondertekend getal, wordt een vaste bias (127 voor enkele precisie, 1023 voor dubbele) opgeteld voordat het veld binair wordt uitgeschreven. Ten derde wordt de fractionele mantisse bit voor bit uitgebreid met de klassieke 'vermenigvuldig met twee, neem het gehele deel als de volgende bit, behoud de rest'-methode — herhaald totdat het mantisseveld vol is, waarna de overgebleven bits bepalen of het resultaat naar boven of naar beneden wordt afgerond (round-half-to-even, de IEEE-754-standaard).

Dit is precies waarom een getal zo gewoon als 0,1 niet exact wordt opgeslagen. Binair is 0,1 een repeterende breuk (0,0001100110011…, oneindig), dus geen eindige mantisse kan het precies bevatten — het moet ergens worden afgerond. Codeer 0,1 als een 32-bits float en lees de bits terug, en je krijgt niet 0,1 terug: je krijgt exact 0,100000001490116119384765625. Dubbele precisie heeft 29 mantissebits meer om mee te werken, dus de afrondfout is veel kleiner, maar ook niet nul — 0,1 als een 64-bits double is exact 0,1000000000000000055511151231257827021181583404541015625. Deze tool berekent die exacte opgeslagen waarde met big-integer-rekenwerk (geen floating-point shortcuts) zodat het verschil tussen wat je typte en wat de hardware daadwerkelijk bewaart nooit verborgen of benaderd wordt.

Speciale waarden krijgen exacte, gereserveerde bitpatronen in plaats van een normale codering: nul en negatieve nul hebben alle exponent- en mantissebits op nul (alleen de tekenbit verschilt), ±Oneindig heeft alle exponentbits op één met een mantisse die helemaal nul is, en NaN heeft alle exponentbits op één met minstens één mantissebit op één. Alles hier draait lokaal in jouw browser — niets wat je typt wordt ergens geüpload — wat dit een veilige plek maakt om echte intuïtie op te bouwen voor floating-point bugs: waarom `0.1 + 0.2 !== 0.3` in bijna elke programmeertaal, waarom float32-textures in grafische code precisie verliezen die float64 niet zou verliezen, en waarom financiële code over het algemeen binaire floating-point helemaal moet vermijden.