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 = 6,5
Šest a půl. V desítkové soustavě nic zvláštního.
- x = 110,1₂
Za čárkou jsou váhy ½, ¼, ⅛ — půlka je jedna jednička.
- 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.
- 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.
- 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.
binary32 (float) | binary64 (double) | |
|---|---|---|
| znaménko | 1 bit | 1 bit |
| exponent | 8 bitů, posun 127 | 11 bitů, posun 1023 |
| mantisa | 23 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
| exponent | mantisa | co to je |
|---|---|---|
| samé nuly | nula | ±0 — ano, dvě nuly, a −0 se hodí, aby šlo poznat, ze které strany se k ní číslo blížilo |
| samé nuly | nenulová | subnormální — bez skryté jedničky; vyplňují mezeru kolem nuly |
| samé jedničky | nula | ±∞ — výsledek dělení nulou, a dá se s ním dál počítat |
| samé jedničky | nenulová | 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.