IEEE-754 Float Visualizer
Se exakt hur ett decimaltal lagras som en IEEE-754 float — teckenbit, exponentbitar och mantissabitar — och varför siffror som 0.1 inte lagras exakt.
Resultat
Varje flyttal som en dator lagrar - ett JavaScript-tal, ett C-float, ett Python-float - kodas på samma sätt under IEEE 754: en teckenbit, ett block med exponentbitar och ett block med mantissa (bråk)bitar. Enkel precision (32-bitars) använder 1 teckenbit, 8 exponentbitar och 23 mantissabitar; dubbel precision (64-bitars), formatet bakom nästan alla språks standardnummertyp, använder 1 teckenbit, 11 exponentbitar och 52 mantissabitar. Det här verktyget tar vilket decimaltal som helst du skriver, kodar det i endera bredden med webbläsarens egen DataView/ArrayBuffer flytkodare - samma maskin som din kod faktiskt körs på - och färgar varje bit efter vilken region den tillhör.
Själva kodningen följer tre steg, och det här verktyget går igenom alla istället för att bara visa de sista bitarna. Först, normalisering: talet skrivs om till 1.mantissa × 2^exponent, med exakt en siffra som inte är noll före den binära punkten (tal som är för små för det får den subnormala behandlingen istället, utan implicit inledande 1). För det andra, exponentbias: eftersom exponentfältet måste lagra både positiva och negativa exponenter som ett tal utan tecken, läggs en fast bias (127 för enkel precision, 1023 för dubbel) innan fältet skrivs ut i binärt. För det tredje utökas bråkmantissan bit för bit med den klassiska metoden "multiplicera med två, ta heltalsdelen som nästa bit, behåll resten" - upprepad tills mantissfältet är fullt, då de överblivna bitarna avgör om resultatet avrundas uppåt eller nedåt (runda-halva-till-jämnt, IEEE-754 standard).
Det är just därför ett så vanligt tal som 0,1 inte lagras exakt. I binärt är 0,1 en upprepad bråkdel (0,0001100110011…, för alltid), så ingen finit mantissa kan hålla den exakt - den måste avrundas någonstans. Koda 0.1 som en 32-bitars float och läs tillbaka bitarna, och du får inte tillbaka 0.1: du får exakt 0.100000001490116119384765625. Dubbel precision har 29 fler mantissabitar att arbeta med, så dess avrundningsfel är mycket mindre, men det är inte heller noll — 0,1 eftersom en 64-bitars dubbla är exakt 0,10000000000000000005551115123125782702115455451010000000000. Det här verktyget beräknar det exakta lagrade värdet med aritmetik med stort heltal (inga genvägar med flyttal), så gapet mellan det du skrev och vad hårdvaran faktiskt behåller aldrig döljs eller uppskattas.
Specialvärden får exakta, reserverade bitmönster snarare än en normal kodning: noll och negativ noll har exponent- och mantissabitar helt noll (endast teckenbiten skiljer sig åt), ±Infinity har en exponentbit med en mantis med helt noll, och NaN har en exponentbit med minst en mantissbit. Allt här körs lokalt i din webbläsare — inget du skriver laddas upp någonstans — vilket gör det här till en säker plats att bygga riktig intuition för flyttals-buggar: varför `0.1 + 0.2 !== 0.3` i nästan alla programmeringsspråk, varför float32-texturer i grafikkod tappar precision som float64 i allmänhet inte borde undvika att komma med, och varför binär finansiell kod i allmänhet inte borde undvika punkt.