IEEE-754 Flyttallsvisualisering
Se nøyaktig hvordan et desimaltall lagres som et IEEE-754 flyttall – fortegnsbit, eksponentbiter og mantissebiter – og hvorfor tall som 0.1 ikke lagres eksakt.
🔒 Behandles i sin helhet i nettleseren din – ingenting du skriver inn her blir noen gang lastet opp.
Resultat
Ethvert flyttall en datamaskin lagrer – et JavaScript-tall, en C float, en Python float – kodes på samme måte under IEEE 754: én fortegnsbit, en blokk eksponentbiter og en blokk mantissebiter (fraksjon). Enkel presisjon (32-bit) bruker 1 fortegnsbit, 8 eksponentbiter og 23 mantissebiter; dobbel presisjon (64-bit), formatet bak nesten alle språks standard talltype, bruker 1 fortegnsbit, 11 eksponentbiter og 52 mantissebiter. Dette verktøyet tar ethvert desimaltall du skriver inn, koder det i enten bredde ved hjelp av nettleserens egen DataView/ArrayBuffer flyttalls-koder – den samme mekanismen koden din faktisk kjører på – og fargelegger hver bit etter hvilket område den tilhører.
Selve kodingen følger tre steg, og dette verktøyet går gjennom alle sammen i stedet for bare å vise de endelige bitene. Først, normalisering: tallet skrives om som 1.mantisse × 2^eksponent, med nøyaktig ett siffer ulikt null før det binære punktumet (tall som er for små for det får i stedet den subnormale behandlingen, uten implisitt ledende 1). Deretter, eksponentbias: siden eksponentfeltet må lagre både positive og negative eksponenter som et tall uten fortegn, legges en fast bias (127 for enkel presisjon, 1023 for dobbel) til før feltet skrives ut binært. For det tredje utvides den fraksjonelle mantissen bit for bit med den klassiske «multipliser med to, ta heltallsdelen som neste bit, behold resten»-metoden – gjentatt til mantissefeltet er fullt, og da avgjør de resterende bitene om resultatet rundes opp eller ned (rund-av-til-nærmeste-partall, IEEE-754-standarden).
Dette er nøyaktig hvorfor et så vanlig tall som 0.1 ikke lagres eksakt. I binært er 0.1 en repeterende brøk (0.0001100110011…, i det uendelige), så ingen endelig mantisse kan holde den presist – den må rundes av et sted. Kod 0.1 som et 32-bit flyttall og les bitene tilbake, og du får ikke 0.1 tilbake: du får nøyaktig 0.100000001490116119384765625. Dobbel presisjon har 29 flere mantissebiter å jobbe med, så avrundingsfeilen er langt mindre, men den er heller ikke null – 0.1 som en 64-bit double er nøyaktig 0.1000000000000000055511151231257827021181583404541015625. Dette verktøyet beregner den eksakte lagrede verdien med heltallsaritmetikk (ingen flyttallsnarveier) slik at gapet mellom det du skrev og det maskinvaren faktisk holder, aldri skjules eller approksimeres.
Spesialverdier får eksakte, reserverte bitmønstre i stedet for en normal koding: null og negativ null har alle-null eksponent- og mantissebiter (bare fortegnsbiten skiller), ±Uendelig har alle-en eksponentbiter med en alle-null mantisse, og NaN har alle-en eksponentbiter med minst én mantissebit satt. Alt her kjører lokalt i nettleseren din – ingenting du skriver lastes opp noe sted – noe som gjør dette til et trygt sted å bygge ekte intuisjon for flyttallsfeil: hvorfor `0.1 + 0.2 !== 0.3` i nesten alle programmeringsspråk, hvorfor float32-teksturer i grafikkode mister presisjon som float64 ikke ville gjort, og hvorfor finansiell kode generelt bør unngå binære flyttall helt.