Vizualizér IEEE-754 Float
Podívejte se přesně, jak je desetinné číslo uloženo jako IEEE-754 float — bit znaménka, bity exponentu a bity mantisy — a proč čísla jako 0.1 nejsou uložena přesně.
🔒 Zpracováno výhradně ve vašem prohlížeči – nic, co zde zadáte, se nikdy nenahraje.
Výsledek
Každé číslo s plovoucí desetinnou čárkou, které počítač uloží — číslo v JavaScriptu, float v C, float v Pythonu — je kódováno stejně podle IEEE 754: jeden bit znaménka, blok bitů exponentu a blok bitů mantisy (zlomku). Jednoduchá přesnost (32 bitů) používá 1 bit znaménka, 8 bitů exponentu a 23 bitů mantisy; dvojitá přesnost (64 bitů), formát stojící za výchozím číselným typem téměř každého jazyka, používá 1 bit znaménka, 11 bitů exponentu a 52 bitů mantisy. Tento nástroj vezme libovolné zadané desetinné číslo, zakóduje ho v obou šířkách pomocí skutečného kodéru floatů z prohlížeče (DataView/ArrayBuffer) — téže mašinérie, na které váš kód skutečně běží — a každý bit obarví podle toho, do které oblasti patří.
Samotné kódování probíhá ve třech krocích a tento nástroj vámi projde všemi, místo aby pouze ukázal výsledné bity. Zaprvé, normalizace: číslo se přepíše jako 1.mantisa × 2^exponent, s právě jednou nenulovou číslicí před binární desetinnou čárkou (příliš malá čísla na to dostanou místo toho subnormální reprezentaci, bez implicitní vedoucí jedničky). Zadruhé, posun exponentu: protože pole exponentu musí ukládat kladné i záporné exponenty jako neznaménkové číslo, před vypsáním pole ve dvojkové soustavě se přičte pevný posun (127 pro jednoduchou přesnost, 1023 pro dvojitou). Zatřetí, zlomková mantisa se rozepisuje bit po bitu klasickou metodou „násob dvěma, celou část vezmi jako další bit, zbytek si ponechej“ — opakuje se, dokud není pole mantisy plné, a v ten okamžik zbylé bity rozhodnou, zda se výsledek zaokrouhlí nahoru nebo dolů (zaokrouhlování k nejbližšímu sudému, výchozí v IEEE-754).
Přesně proto není tak obyčejné číslo jako 0.1 uloženo přesně. Ve dvojkové soustavě je 0.1 periodický zlomek (0.0001100110011… donekonečna), takže ho žádná konečná mantisa nemůže pojmout přesně — někde se musí zaokrouhlit. Zakódujte 0.1 jako 32bitový float a přečtěte bity zpět, a nedostanete 0.1: dostanete přesně 0.100000001490116119384765625. Dvojitá přesnost má k dispozici o 29 bitů mantisy víc, takže její zaokrouhlovací chyba je mnohem menší, ale také není nulová — 0.1 jako 64bitový double je přesně 0.1000000000000000055511151231257827021181583404541015625. Tento nástroj počítá tuto přesně uloženou hodnotu pomocí celočíselné aritmetiky s velkými čísly (žádné zkratky s plovoucí desetinnou čárkou), takže rozdíl mezi tím, co jste zadali, a tím, co hardware skutečně uchovává, není nikdy skrytý ani aproximovaný.
Speciální hodnoty dostávají přesné, vyhrazené bitové vzory místo normálního kódování: nula a záporná nula mají všechny bity exponentu a mantisy nulové (liší se pouze bit znaménka), ±nekonečno má všechny bity exponentu jedničkové s nulovou mantisou a NaN má všechny bity exponentu jedničkové a alespoň jeden bit mantisy nastavený na 1. Vše zde běží lokálně ve vašem prohlížeči — nic z toho, co napíšete, se nikam neodesílá — což z toho dělá bezpečné místo pro budování skutečné intuice ohledně chyb s plovoucí desetinnou čárkou: proč `0.1 + 0.2 !== 0.3` téměř v každém programovacím jazyce, proč textury float32 v grafickém kódu ztrácejí přesnost, kterou by float64 neztratil, a proč by se finanční kód měl binární plovoucí desetinné čárce obecně vyhýbat.