Formát s plovoucí desetinnou čárkou s jednou přesností - Single-precision floating-point format
Formát s plovoucí desetinnou čárkou s jednou přesností (někdy nazývané FP32 nebo float32) je formát čísla počítače, obvykle okupující 32 bitů v paměť počítače; představuje široký dynamický rozsah číselných hodnot pomocí a plovoucí radiální bod.
Proměnná s plovoucí desetinnou čárkou může představovat širší rozsah čísel než a pevný bod proměnná stejné bitové šířky za cenu přesnosti. A podepsaný 32-bit celé číslo proměnná má maximální hodnotu 231 - 1 = 2 147 483 647, zatímco an IEEE 754 32bitová proměnná base-2 s plovoucí desetinnou čárkou má maximální hodnotu (2 - 2−23) × 2127 ≈ 3.4028235 × 1038. Všechna celá čísla se 7 nebo méně desetinnými číslicemi a libovolná 2n pro celé číslo −149 ≤ n ≤ 127, lze převést přesně na hodnotu plovoucí desetinné čárky s jednou přesností IEEE 754.
V IEEE 754-2008 Standard, 32bitový formát base-2 se oficiálně označuje jako binary32; to bylo voláno singl v IEEE 754-1985. IEEE 754 specifikuje další typy s plovoucí desetinnou čárkou, například 64-bit base-2 dvojnásobná přesnost a v poslední době reprezentace základny-10.
Jeden z prvních programovací jazyky poskytnout datové typy s plovoucí desetinnou čárkou s jednoduchou a dvojitou přesností bylo Fortran. Před rozšířeným přijetím IEEE 754-1985 záviselo na reprezentaci a vlastnostech datových typů s plovoucí desetinnou čárkou výrobce počítače a počítačový model a na základě rozhodnutí učiněných návrháři programovacího jazyka. Např., GW-BASIC Jedním přesným datovým typem byl 32bitový MBF formát s plovoucí desetinnou čárkou.
Jediná přesnost se nazývá NEMOVITÝ v Fortran,[1] JEDNORÁZOVÝ v Společný Lisp,[2] plovák v C, C ++, C#, Jáva,[3] Plovák v Haskell,[4] a Singl v Objekt Pascal (Delphi ), Visual Basic, a MATLAB. Nicméně, plovák v Krajta, Rubín, PHP, a OCaml a singl ve verzích Oktáva před 3.2 viz dvojnásobná přesnost čísla. Ve většině implementací PostScript, a nějaký vestavěné systémy, jediná podporovaná přesnost je jediná.
Plovoucí bod formáty |
---|
IEEE 754 |
|
jiný |
Binární formát s plovoucí desetinnou čárkou s jednou přesností IEEE 754: binary32
Standard IEEE 754 specifikuje a binary32 jako mající:
- Podepsat bit: 1 bit
- Exponent šířka: 8 bitů
- Významné přesnost: 24 bitů (23 výslovně uloženo)
To dává od 6 do 9 významná desetinná místa přesnost. Pokud se desetinný řetězec s nejvýše 6 platnými číslicemi převede na reprezentaci s přesností na IEEE 754 a poté se převede zpět na desetinný řetězec se stejným počtem číslic, měl by konečný výsledek odpovídat původnímu řetězci. Pokud je číslo IEEE 754 s jednou přesností převedeno na desetinný řetězec s alespoň 9 platnými číslicemi a poté převedeno zpět na reprezentaci s jednou přesností, musí se konečný výsledek shodovat s původním číslem.[5]
Znakový bit určuje znaménko čísla, které je také znaménkem znaménka. Exponent je 8bitové celé číslo bez znaménka od 0 do 255 palců zkreslená forma: hodnota exponentu 127 představuje skutečnou nulu. Exponenty se pohybují od -126 do +127, protože exponenty −127 (všechny 0 s) a +128 (všechny 1 s) jsou vyhrazeny pro speciální čísla.
Skutečný význam zahrnuje 23 zlomkových bitů napravo od binárního bodu a znak implicitní úvodní bit (nalevo od binárního bodu) s hodnotou 1, pokud exponent není uložen se všemi nulami. Tedy pouze 23 zlomků bitů významně se zobrazí ve formátu paměti, ale celková přesnost je 24 bitů (ekvivalent logu10(224) ≈ 7,225 desetinných míst). Bity jsou rozloženy následovně:
Skutečná hodnota předpokládaná daným 32bitem binary32 data s daným podepsat, předpjatý exponent E (8bitové celé číslo bez znaménka) a a 23bitový zlomek je
- ,
který přináší
V tomto příkladu:
- ,
- ,
- ,
- ,
- .
tím pádem:
- .
Poznámka:
- ,
- ,
- ,
- .
Kódování komponent
Binární exponent s plovoucí desetinnou čárkou s přesnou přesností je kódován pomocí offset-binární reprezentace, přičemž nulový offset je 127; také známý jako zkreslení exponentů ve standardu IEEE 754.
- Emin = 01H-7FH = −126
- Emax = FEH-7FH = 127
- Vychýlení exponentů = 7FH = 127
Abychom tedy získali skutečný exponent, jak je definován offsetově-binární reprezentací, musí se offset 127 odečíst od uloženého exponenta.
Uložené exponenty 00H a FFH jsou interpretovány speciálně.
Exponent | zlomek = 0 | zlomek ≠ 0 | Rovnice |
---|---|---|---|
00H | nula | podnormální číslo | |
01H, ..., FEH | normální hodnota | ||
FFH | ±nekonečno | NaN (tichý, signalizační) |
Minimální kladná normální hodnota je a minimální kladná (podnormální) hodnota je .
Převod z desítkové reprezentace na formát binary32
Tato sekce případně obsahuje původní výzkum.Únor 2020) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
Tato sekce možná matoucí nebo nejasné čtenářům. Příklady jsou zejména jednoduché konkrétní případy (jednoduché hodnoty, které lze přesně reprezentovat v binární podobě, bez exponentové části). Tato část je také pravděpodobně mimo téma: nejedná se o článek o převodu a převod z desítkové soustavy pomocí desítkové aritmetiky (na rozdíl od převodu ze znakového řetězce) je neobvyklý.Únor 2020) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
Obecně platí přísný převod (včetně chování zaokrouhlování) reálného čísla do jeho ekvivalentního formátu binary32 podle samotného standardu IEEE 754.
Zde můžeme ukázat, jak převést reálné číslo base-10 do formátu IEEE 754 binary32 pomocí následujícího obrysu:
- Zvažte reálné číslo s celým číslem a zlomkovou částí, například 12,375
- Převést a normalizovat celočíselná část do binární
- Převeďte zlomkovou část pomocí následující techniky, jak je znázorněno zde
- Přidejte dva výsledky a upravte je tak, aby vytvářely správnou konečnou konverzi
Převod zlomkové části:Zvažte 0,375, zlomkovou část 12,375. Chcete-li jej převést na binární zlomek, vynásobte zlomek 2, vezměte celočíselnou část a opakujte s novým zlomkem o 2, dokud nebude nalezen zlomek nuly nebo dokud nebude dosaženo limitu přesnosti, což je 23 číslic zlomku pro formát IEEE 754 binary32 .
- , celočíselná část představuje číslici binárního zlomku. Chcete-li pokračovat, znovu vynásobte 0,750 čísly 2
- , zlomek = 0,000, ukončit
Vidíme to může být přesně vyjádřen v binárním formátu jako . Ne všechny desetinné zlomky lze reprezentovat v binárním zlomku konečné číslice. Například desetinnou čárku 0,1 nelze v binárním vyjádřit přesně, pouze aproximovat. Proto:
Protože formát IEEE 754 binary32 vyžaduje, aby byly reprezentovány skutečné hodnoty formát (viz Normalizované číslo, Denormalizované číslo ), 1100.011 je posunut doprava o 3 číslice
Nakonec vidíme, že:
Z čehož odvodíme:
- Exponent je 3 (a ve zkreslené formě je to tedy )
- Frakce je 100011 (při pohledu napravo od binárního bodu)
Z nich můžeme vytvořit výslednou 32bitovou reprezentaci formátu IEEE 754 binary32 ve formátu 12.375:
Poznámka: zvažte převod 68.123 na formát IEEE 754 binary32: Pomocí výše uvedeného postupu, který očekáváte přičemž poslední 4 bity jsou 1001. Kvůli výchozímu chování zaokrouhlování formátu IEEE 754 však získáte , jehož poslední 4 bity jsou 1010.
Příklad 1:Zvažte desetinnou čárku 1. Vidíme, že:
Z čehož odvodíme:
- Exponent je 0 (a ve zkreslené formě je to proto) )
- Zlomek je 0 (při pohledu napravo od binárního bodu v 1.0 je vše )
Z nich můžeme vytvořit výslednou 32bitovou reprezentaci formátu IEEE 754 binary32 reálného čísla 1:
Příklad 2:Zvažte hodnotu 0,25. Vidíme, že:
Z čehož odvodíme:
- Exponent je −2 (a v předpjaté formě je )
- Frakce je 0 (při pohledu napravo od binárního bodu v 1.0 jsou všechny nuly)
Z nich můžeme vytvořit výslednou 32bitovou reprezentaci formátu IEEE 754 binary32 ve skutečném čísle 0,25:
Příklad 3:Zvažte hodnotu 0,375. Viděli jsme to
Proto po stanovení zastoupení 0,375 as můžeme postupovat jak je uvedeno výše:
- Exponent je −2 (a ve zkreslené formě je) )
- Frakce je 1 (při pohledu napravo od binárního bodu v 1.1 je singl )
Z nich můžeme vytvořit výslednou 32bitovou reprezentaci formátu IEEE 754 binary32 ve skutečném čísle 0,375:
Příklady s jednou přesností
Tyto příklady jsou uvedeny v bitech zastoupení, v hexadecimální a binární, hodnoty s plovoucí desetinnou čárkou. To zahrnuje znaménko, (zkreslený) exponent a význam.
0 00000000 000000000000000000000012 = 0000 000116 = 2−126 × 2−23 = 2−149 ≈ 1.4012984643 × 10−45 (nejmenší kladné podnormální číslo)
0 00000000 111111111111111111111112 = 007f ffff16 = 2−126 × (1 − 2−23) ≈ 1.1754942107 ×10−38 (největší podnormální číslo)
0 00000001 000000000000000000000002 = 0080 000016 = 2−126 ≈ 1.1754943508 × 10−38 (nejmenší kladné normální číslo)
0 11111110 111111111111111111111112 = 7f7f ffff16 = 2127 × (2 − 2−23) ≈ 3.4028234664 × 1038 (největší normální číslo)
0 01111110 111111111111111111111112 = 3f7f ffff16 = 1 − 2−24 ≈ 0,999999940395355225 (největší počet menší než jeden)
0 01111111 000000000000000000000002 = 3f80 000016 = 1 (jeden)
0 01111111 000000000000000000000012 = 3f80 000116 = 1 + 2−23 ≈ 1,00000011920928955 (nejmenší číslo větší než jedna)
1 10000000 000000000000000000000002 = c000 000016 = −20 00000000 000000000000000000000002 = 0000 000016 = 01 00000000 000000000000000000000002 = 8000 000016 = −0 0 11111111 000000000000000000000002 = 7f80 000016 = nekonečno1 11111111 000000000000000000000002 = ff80 000016 = −infinity 0 10000000 100100100001111110110112 = 4049 0fdb16 ≈ 3,14159274101257324 ≈ π (pi) 0 01111101 01010101010101010101010112 = 3eaa aaab16 ≈ 0,333333343267440796 ≈ 1/3 x 11111111 100000000000000000000012 = ffc0 000116 = qNaN (na procesorech x86 a ARM) x 11111111 000000000000000000000012 = 80 000 ff16 = sNaN (na procesorech x86 a ARM)
Ve výchozím nastavení se 1/3 zaokrouhluje nahoru, nikoli dolů dvojnásobná přesnost, kvůli sudému počtu bitů v myslivci. Bity 1/3 za zaoblením jsou 1010...
což je více než 1/2 a jednotka na posledním místě.
Kódování qNaN a sNaN nejsou specifikována v IEEE 754 a implementovány odlišně na různých procesorech. The x86 rodina a PAŽE rodinné procesory používají k označení tichého NaN nejvýznamnější bit pole významového pole. The PA-RISC procesory používají bit k indikaci NaN signalizace.
Převod z binární s jednou přesností na desítkovou
Tato sekce případně obsahuje původní výzkum.Únor 2020) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
Tato sekce možná matoucí nebo nejasné čtenářům. Zejména existuje pouze velmi jednoduchý příklad bez zaokrouhlování. Tato část je také pravděpodobně mimo téma: nejedná se o článek o převodu a převod na desítkové pomocí desítkové aritmetiky je neobvyklý.Únor 2020) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
Začneme hexadecimálním vyjádřením hodnoty, 41C80000, v tomto příkladu a převést jej na binární:
pak jej rozdělíme na tři části: bit znaménka, exponent a význam.
- Sign bit:
- Exponent:
- Význam:
Potom přidáme implicitní 24. bit do mantinelu:
- Význam:
a dekódovat hodnotu exponentu odečtením 127:
- Surový exponent:
- Dekódovaný exponent:
Každý z 24 bitů mantinelu (včetně implicitního 24. bitu), bit 23 až bit 0, představuje hodnotu, počínaje 1 a polovinou pro každý bit, následovně:
bit 23 = 1 bit 22 = 0,5 bit 21 = 0,25 bit 20 = 0,125 bit 19 = 0,0625 bit 18 = 0,03125..bit 0 = 0,00000011920928955078125
Význam v tomto příkladu má tři bity nastavené: bit 23, bit 22 a bit 19. Nyní můžeme významový znak dekódovat přidáním hodnot představovaných těmito bity.
- Dekódovaný význam:
Pak musíme znásobit základnu, 2, na moc exponenta, abychom získali konečný výsledek:
Tím pádem
To odpovídá:
kde s je znakový bit, X je exponent a m je význam.
Přesná omezení desetinných hodnot v [1, 16777216]
- Desetinná čísla mezi 1 a 2: pevný interval 2−23 (1+2−23 je další největší float po 1)
- Desetinná čísla mezi 2 a 4: pevný interval 2−22
- Desetinná čísla mezi 4 a 8: pevný interval 2−21
- ...
- Desetinná čísla mezi 2n a 2n + 1: pevný interval 2n-23
- ...
- Desetinná čísla mezi 222= 4194304 a 223= 8388608: pevný interval 2−1=0.5
- Desetinná čísla mezi 223= 8388608 a 224= 16777216: pevný interval 20=1
Přesná omezení celočíselných hodnot
- Celá čísla mezi 0 a 16777216 lze přesně vyjádřit (platí také pro záporná celá čísla mezi −16777216 a 0)
- Celá čísla mezi 224= 16777216 a 225= 33554432 zaokrouhleno na násobek 2 (sudé číslo)
- Celá čísla mezi 225 a 226 zaokrouhlete na násobek 4
- ...
- Celá čísla mezi 2n a 2n + 1 zaokrouhlete na násobek 2n-23
- ...
- Celá čísla mezi 2127 a 2128 zaokrouhlete na násobek 2104
- Celá čísla větší nebo rovna 2128 jsou zaokrouhleny na „nekonečno“.
Optimalizace
Návrh formátu s plovoucí desetinnou čárkou umožňuje různé optimalizace vyplývající ze snadného generování a logaritmus základny-2 aproximace z celočíselného pohledu na surový bitový vzor. Celočíselná aritmetika a posunutí bitů mohou poskytnout přibližnou hodnotu k vzájemná odmocnina (rychlá druhá odmocnina ), běžně vyžadováno v počítačová grafika.
Viz také
- Standard IEEE pro pohyblivou řádovou čárkou (IEEE 754)
- ISO / IEC 10967, jazykově nezávislá aritmetika
- Primitivní datový typ
- Numerická stabilita
Reference
- ^ „SKUTEČNÉ prohlášení“. scc.ustc.edu.cn.
- ^ "CLHS: Typ KRÁTKÝ-PLÁVAJÍCÍ, JEDNORÁZOVÝ, DVOJNÁSOBNÍ PLATÍ ..."
- ^ „Primitivní datové typy“. Dokumentace Java.
- ^ „6 předdefinovaných typů a tříd“. haskell.org. 20. července 2010.
- ^ William Kahan (1. října 1997). „Přednáškové poznámky o stavu normy IEEE 754 pro binární aritmetiku s plovoucí desetinnou čárkou“ (PDF). p. 4.