BitLab vzorek, který se někdo zeptá

Tohle je statická kopie kapitoly pro vyhledávače. Interaktivní verze má animované obrázky, kontrolní otázky a tlačítka, která příklad načtou do kalkulačky.

Plovoucí čárka: znaménko, exponent, mantisa

Celé číslo má pevný rozsah a krok jedna. Když je potřeba uložit 0,0000001 i 10 000 000 v jednom typu, pevný krok nestačí — a řešení je stejné jako v technickém zápisu čísel: uložit zvlášť číslice a zvlášť řád.

x = (−1)s · 1,m · 2eIEEE 754
01000000110100000000000000000000znaménkoexponent (8 b)mantisa (23 b)6,5 = 1,101₂ × 2²uložený exponent 129 = 2 + 127
  1. x = 6,5

    Šest a půl. V desítkové soustavě nic zvláštního.

  2. x = 110,1₂

    Za čárkou jsou váhy ½, ¼, ⅛ — půlka je jedna jednička.

  3. x = 1,1010₂ × 22

    Vždycky jde udělat, aby vlevo od čárky stála právě jedna jednička. A pak ji není třeba ukládat — vždycky tam je.

  4. 0 | 1000 0001 | 101 0000 0000 0000 0000 0000

    Znaménko, exponent s posunem 127, a to za čárkou. Skrytá jednička se neukládá — proto se mantise vejde o bit víc, než má místa.

  5. e_uloženo = e + 127

    Aby šla dvě čísla porovnat jako celá čísla, bit po bitu. Kdyby byl exponent v doplňku, pořadí by se u nuly zlomilo.

Šest a půl uložených jako binary32, krok po kroku. Poslední krok říká, proč je exponent posunutý o 127 a ne v doplňku.
binary32 (float)binary64 (double)
znaménko1 bit1 bit
exponent8 bitů, posun 12711 bitů, posun 1023
mantisa23 bitů (+1 skrytý)52 bitů (+1 skrytý)
platných číslic~7~16

Ta skrytá jednička

Po normalizaci stojí vlevo od čárky vždycky jednička — jinak by šlo číslo posunout ještě o řád. Když je to jisté, není důvod ji ukládat, a mantise se tím zadarmo přidá jeden bit přesnosti. Cenu za to platí nula: ta jako 1,000… zapsat nejde, a musí se pro ni vyhradit zvláštní vzorek (exponent samé nuly).

Zvláštní hodnoty, a k čemu jsou

exponentmantisaco to je
samé nulynula±0 — ano, dvě nuly, a −0 se hodí, aby šlo poznat, ze které strany se k ní číslo blížilo
samé nulynenulovásubnormální — bez skryté jedničky; vyplňují mezeru kolem nuly
samé jedničkynula±∞ — výsledek dělení nulou, a dá se s ním dál počítat
samé jedničkynenulováNaN — „tohle není číslo“, a nerovná se sobě samému

NaN != NaN je vlastnost, ne chyba. Je to jediný způsob, jak se v jazyce bez výjimek zeptat „přišlo mi zpátky něco nesmyslného?“ — a je to zároveň důvod, proč se pole s NaN nedá seřadit obvyklým porovnáváním a proč x !== x je legitimní test.

Proč je exponent posunutý

Uložený exponent není e, ale e + 127. Kdyby byl v dvojkovém doplňku, pořadí vzorků by se u nuly zlomilo a dvě čísla by nešlo porovnat jako celá čísla. S posunem to jde: kladné floaty se dají porovnávat bit po bitu jako celá čísla, což je zrychlení, které v roce 1985 stálo za jednu podivnost v zápisu.

Vzorce v této kapitole

IEEE — číslo s plovoucí čárkou
x = (−1)ˢ · 1,m · 2ᵉ [—] IEEE 754
bias — uložený exponent
e_uloženo = e + 127 (binary32) [—] IEEE 754