IEEE-754 Floatvisualiserare
Se exakt hur ett decimaltal lagras som en IEEE-754-float – teckenbit, exponentbitar och mantissbitar – och varför tal som 0,1 inte lagras exakt.
🔒 Bearbetas helt i din webbläsare – ingenting du anger här laddas någonsin upp.
Resultat
Varje flyttal som en dator lagrar – ett JavaScript-nummer, en C-float, en Python-float – kodas på samma sätt enligt IEEE 754: en teckenbit, ett block exponentbitar och ett block mantissbitar (fraktionsbitar). Enkel precision (32 bitar) använder 1 teckenbit, 8 exponentbitar och 23 mantissbitar; dubbel precision (64 bitar), formatet bakom nästan alla programspråks standardtaltyp, använder 1 teckenbit, 11 exponentbitar och 52 mantissbitar. Detta verktyg tar vilket decimaltal du än skriver in, kodar det i endera bredden med hjälp av webbläsarens egen flyttalskodare i DataView/ArrayBuffer – samma maskineri som din kod faktiskt körs på – och färglägger varje bit efter vilket område den tillhör.
Själva kodningen följer tre steg, och detta verktyg går igenom alla i stället för att bara visa de slutliga bitarna. Först normalisering: talet skrivs om som 1.mantissa × 2^exponent, med exakt en icke-nollsiffra före den binära punkten (tal som är för små för detta får istället den subnormala behandlingen, utan en implicit ledande etta). Sedan exponentförskjutning: eftersom exponentfältet måste lagra både positiva och negativa exponenter som ett tal utan tecken, adderas en fast förskjutning (127 för enkel precision, 1023 för dubbel) innan fältet skrivs ut binärt. Till sist byggs den fraktionella mantissan ut bit för bit med den klassiska metoden ”multiplicera med två, ta heltalsdelen som nästa bit, behåll resten” – upprepas tills mantissfältet är fullt, då de återstående bitarna avgör om resultatet avrundas uppåt eller nedåt (avrundning till närmaste jämna tal, standarden i IEEE 754).
Det är precis därför ett så vanligt tal som 0,1 inte lagras exakt. Binärt är 0,1 ett upprepande bråk (0,0001100110011… i all oändlighet), så ingen ändlig mantissa kan hålla det exakt – det måste avrundas någonstans. Koda 0,1 som ett 32-bitars flyttal och läs tillbaka bitarna, och du får inte tillbaka 0,1: du får exakt 0,100000001490116119384765625. Dubbel precision har 29 fler mantissbitar att arbeta med, så dess avrundningsfel är mycket mindre, men det är inte heller noll – 0,1 som 64-bitars dubbel är exakt 0,1000000000000000055511151231257827021181583404541015625. Detta verktyg beräknar det exakta lagrade värdet med stora heltal (inga flyttalsgenvägar) så att gapet mellan vad du skrev och vad hårdvaran faktiskt behåller aldrig döljs eller approximeras.
Specialvärden får exakta, reserverade bitmönster i stället för en normal kodning: noll och negativ noll har enbart nollor i exponent- och mantissbitarna (endast teckenbiten skiljer sig), ±Infinity har enbart ettor i exponentbitarna med enbart nollor i mantissan, och NaN har enbart ettor i exponentbitarna med minst en mantissbit satt. Allting här körs lokalt i din webbläsare – ingenting du skriver överförs någonstans – vilket gör detta till en säker plats för att bygga verklig intuition för flyttalsbuggar: varför 0,1 + 0,2 !== 0,3 i nästan alla programspråk, varför float32-texturer i grafik förlorar precision som float64 inte skulle göra, och varför finansiell kod i allmänhet bör undvika binära flyttal helt och hållet.