Formát s plovoucí desetinnou čárkou s jednoduchou 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 počítačového čísla , obvykle zabírá 32 bitů v paměti počítače ; představuje široký dynamický rozsah číselných hodnot pomocí plovoucího bodu radix .
Proměnná s plovoucí desetinnou čárkou může představovat širší rozsah čísel než proměnná s pevným bodem se stejnou šířkou bitu za cenu přesnosti. Podepsal 32-bitové celé číslo proměnná má maximální hodnotu 2 31 - 1 = 2,147,483,647, vzhledem k tomu, IEEE 754 32-bit báze-2 s plovoucí desetinnou čárkou proměnná má maximální hodnotu (2 - 2 -23 ) x 2 127 ≈ 3.4028235 × 10 38 . Všechna celá čísla se 7 nebo méně desetinnými číslicemi a jakákoli 2 n pro celé číslo −149 ≤ n ≤ 127 lze převést přesně na hodnotu s plovoucí desetinnou čárkou s jednoduchou přesností IEEE 754.
Ve standardu IEEE 754-2008 je 32bitový formát base-2 oficiálně označován jako binary32 ; v IEEE 754-1985 se tomu říkalo single . IEEE 754 specifikuje další typy s plovoucí desetinnou čárkou, například 64bitovou dvojitou přesnost base-2 a v poslední době reprezentace base-10.
Jedním z prvních programovacích jazyků, které poskytovaly datové typy s plovoucí desetinnou čárkou s jednoduchou a dvojitou přesností, byl Fortran . Před širokým přijetím IEEE 754-1985, reprezentace a vlastnosti datových typů s plovoucí desetinnou čárkou závisely na výrobci počítače a počítačovém modelu a na rozhodnutích návrhářů programovacího jazyka. Například datový typ s jednou přesností GW-BASIC byl 32bitový formát MBF s plovoucí desetinnou čárkou.
Jedna přesnost se ve Fortranu nazývá REAL , SINGLE-FLOAT v Common Lisp , float v C , C ++ , C# , Java , Float v Haskell a Swift a Single in Object Pascal ( Delphi ), Visual Basic a MATLAB . Nicméně, float v Python , Ruby , PHP a OCaml a jediná ve verzích Octave před 3,2 odkazují na dvojitou přesností čísla. Ve většině implementací PostScriptu a některých vestavěných systémů je jediná podporovaná přesnost jednoduchá.
Formáty s plovoucí desetinnou čárkou |
---|
IEEE 754 |
jiný |
IEEE 754 binární formát s plovoucí desetinnou čárkou s jednoduchou přesností: binary32
Standard IEEE 754 specifikuje binary32 jako mající:
- Signální bit : 1 bit
- Šířka exponentu : 8 bitů
- Významná přesnost : 24 bitů (23 explicitně uloženo)
To dává přesnost od 6 do 9 platných desetinných číslic . Pokud je desetinný řetězec s nejvýše 6 platnými číslicemi převeden na reprezentaci s jednoduchou přesností IEEE 754 a poté převeden zpět na desetinný řetězec se stejným počtem číslic, konečný výsledek by měl odpovídat původnímu řetězci. Pokud je číslo IEEE 754 s jednoduchou přesností převedeno na desetinný řetězec s alespoň 9 platnými číslicemi a poté převedeno zpět na reprezentaci s jednoduchou přesností, konečný výsledek se musí shodovat s původním číslem.
Znaménkový bit určuje znaménko čísla, které je také znaménkem významu. Exponent je 8bitové celé číslo bez znaménka od 0 do 255, v předpojatém tvaru : 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 implicitní úvodní bit (nalevo od binárního bodu) s hodnotou 1, pokud není exponent uložen se všemi nulami. V paměťovém formátu se tedy objeví pouze 23 zlomkových bitů významu , ale celková přesnost je 24 bitů (ekvivalent log 10 (2 24 ) ≈ 7,225 desetinných číslic). Bity jsou rozloženy následovně:
Skutečná hodnota předpokládaná danými 32bitovými binárními daty 32 s daným znaménkem , zkresleným exponentem e (8bitové celé číslo bez znaménka) a 23bitovým zlomkem je
- ,
který přináší
V tomto příkladu:
- ,
- ,
- ,
- ,
- .
tím pádem:
- .
Poznámka:
- ,
- ,
- ,
- .
Kódování exponentů
Jednosměrný binární exponent s plovoucí desetinnou čárkou je kódován pomocí offset-binární reprezentace, přičemž nulový offset je 127; také známý jako zkreslení exponentu ve standardu IEEE 754.
- E min = 01 H -7F H = -126
- E max = FE H -7F H = 127
- Zkreslení exponentu = 7F H = 127
Aby se tedy získal skutečný exponent definovaný ofsetovou binární reprezentací, musí být offset 127 odečten od uloženého exponentu.
Uložené exponenty 00 H a FF H jsou interpretovány speciálně.
Exponent | zlomek = 0 | zlomek ≠ 0 | Rovnice |
---|---|---|---|
00 H = 00000000 2 | ± nula | podnormální číslo | |
01 H , ..., FE H = 00000001 2 , ..., 11111110 2 | normální hodnota | ||
FF H = 11111111 2 | ± nekonečno | NaN (tichý, signalizace) |
Minimální kladná normální hodnota je a minimální kladná (subnormální) hodnota je .
Převod z desítkové reprezentace na formát binary32
Obecně platí, že striktní převod (včetně chování zaokrouhlování) skutečného čísla do ekvivalentního formátu binary32 naleznete v samotném standardu IEEE 754.
Zde můžeme ukázat, jak převést reálné číslo na bázi 10 na formát IEEE 754 binary32 pomocí následující osnovy:
- Zvažte skutečné číslo s celým číslem a zlomkovou částí, například 12,375
- Převést a normalizovat celočíselnou část na 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, abyste získali správnou konečnou konverzi
Převod zlomkové části: Uvažujte 0,375, zlomková čá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 2, dokud nenajdete zlomek nuly nebo dokud nedosáhnete limitu přesnosti, což je 23 zlomků číslic pro formát IEEE 754 binary32 .
- , celočíselná část představuje binární zlomkovou číslici. Pokračujte opakováním 0,750 o 2
- , zlomek = 0,011, ukončit
Vidíme, že to lze přesně vyjádřit binárně jako . Ne všechny desetinné zlomky mohou být reprezentovány v binárním zlomku s konečnými číslicemi. Například desetinnou desítku nelze přesně vyjádřit binárně, pouze aproximovat. Proto:
Protože formát IEEE 754 binary32 vyžaduje, aby ve formátu byly zobrazeny skutečné hodnoty (viz Normalizované číslo , Denormalizované číslo ), 1100.011 se posune doprava o 3 číslice, aby se stal
Konečně vidíme, že:
Z čehož usuzujeme:
- Exponent je 3 (a ve zkreslené podobě je proto )
- Zlomek je 100011 (při pohledu napravo od binárního bodu)
Z nich můžeme vytvořit výslednou 32bitovou reprezentaci formátu binárního souboru IEEE 754 v binárním formátu 12,375:
Poznámka: zvažte převod 68.123 do formátu IEEE 754 binary32: Pomocí výše uvedeného postupu očekáváte, že poslední 4 bity budou 1001. Vzhledem k 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: Uvažujme desítkové číslo 1. Vidíme, že:
Z čehož usuzujeme:
- Exponent je 0 (a ve zkreslené podobě je 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 skutečného čísla 1 v binárním formátu IEEE 754:
Příklad 2: Uvažujte hodnotu 0,25. Můžeme vidět, že:
Z čehož usuzujeme:
- Exponent je −2 (a ve zkreslené podobě je )
- Zlomek 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 binárního souboru IEEE 754 v binárním formátu reálného čísla 0,25:
Příklad 3: Uvažujte hodnotu 0,375. Viděli jsme to
Po stanovení reprezentace 0,375, jak můžeme postupovat výše:
- Exponent je −2 (a ve zkreslené podobě je )
- Zlomek je 1 (při pohledu napravo od binárního bodu v 1.1 je jediný )
Z nich můžeme vytvořit výslednou 32bitovou reprezentaci formátu binárního souboru IEEE 754 v binárním formátu reálného čísla 0,375:
Příklady s jednou přesností
Tyto příklady jsou uvedeny v bitové reprezentaci hodnoty s plovoucí desetinnou čárkou , v hexadecimálním a binárním formátu. To zahrnuje znaménko, (zkreslený) exponent a význam.
0 00000000 000000000000000000000012 = 0000 000116 = 2−126 × 2−23 = 2−149 ≈ 1.4012984643 × 10−45 (smallest positive subnormal number)
0 00000000 111111111111111111111112 = 007f ffff16 = 2−126 × (1 − 2−23) ≈ 1.1754942107 ×10−38 (largest subnormal number)
0 00000001 000000000000000000000002 = 0080 000016 = 2−126 ≈ 1.1754943508 × 10−38 (smallest positive normal number)
0 11111110 111111111111111111111112 = 7f7f ffff16 = 2127 × (2 − 2−23) ≈ 3.4028234664 × 1038 (largest normal number)
0 01111110 111111111111111111111112 = 3f7f ffff16 = 1 − 2−24 ≈ 0.999999940395355225 (largest number less than one)
0 01111111 000000000000000000000002 = 3f80 000016 = 1 (one)
0 01111111 000000000000000000000012 = 3f80 000116 = 1 + 2−23 ≈ 1.00000011920928955 (smallest number larger than one)
1 10000000 000000000000000000000002 = c000 000016 = −2 0 00000000 000000000000000000000002 = 0000 000016 = 0 1 00000000 000000000000000000000002 = 8000 000016 = −0 0 11111111 000000000000000000000002 = 7f80 000016 = infinity 1 11111111 000000000000000000000002 = ff80 000016 = −infinity 0 10000000 100100100001111110110112 = 4049 0fdb16 ≈ 3.14159274101257324 ≈ π ( pi ) 0 01111101 010101010101010101010112 = 3eaa aaab16 ≈ 0.333333343267440796 ≈ 1/3 x 11111111 100000000000000000000012 = ffc0 000116 = qNaN (on x86 and ARM processors) x 11111111 000000000000000000000012 = ff80 000116 = sNaN (on x86 and ARM processors)
Ve výchozím nastavení se 1/3 zaokrouhluje nahoru, místo dolů jako dvojitá přesnost , kvůli sudému počtu bitů v mantinelu. Bity 1/3 za bodem zaokrouhlení jsou, 1010...
což je více než 1/2 jednotky na posledním místě .
Kódování qNaN a sNaN nejsou v IEEE 754 specifikována a implementována odlišně na různých procesorech. Rodina x86 a procesory řady ARM používají nejvýznamnější bit pole Význam k označení tichého NaN. Tyto PA-RISC procesory používají bit pro indikaci signalizační Nan.
Převod binárních dat s jednoduchou přesností na desítkové
Začneme hexadecimálním vyjádřením hodnoty 41C80000 v tomto příkladu a převedeme ji na binární:
pak to rozdělíme na tři části: znaménkový bit, exponent a význam.
- Podpisový bit:
- Exponent:
- Význam:
Potom přidáme implicitní 24. bit k významu:
- Význam:
a dekódovat hodnotu exponentu odečtením 127:
- Surový exponent:
- Dekódovaný exponent:
Každý z 24 bitů významu (včetně implicitního 24. bitu), bit 23 až bit 0, představuje hodnotu začínající na 1 a polovinu pro každý bit následujícím způsobem:
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 sady bitů: bit 23, bit 22 a bit 19. Nyní můžeme dekódovat význam přidáním hodnot reprezentovaných těmito bity.
- Dekódovaný význam:
Potom potřebujeme znásobit základnu 2 na mocninu exponentu, abychom získali konečný výsledek:
Tím pádem
To je ekvivalentní:
kde s je znaménkový 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 2 n a 2 n+1 : pevný interval 2 n-23
- ...
- Desetinná čísla mezi 2 22 = 4194304 a 2 23 = 8388608: pevný interval 2 −1 = 0,5
- Desetinná čísla mezi 2 23 = 8388608 a 2 24 = 16777216: pevný interval 2 0 = 1
Přesná omezení celočíselných hodnot
- Lze přesně reprezentovat celá čísla mezi 0 a 16777216 (platí také pro záporná celá čísla mezi −16777216 a 0)
- Celá čísla mezi 2 24 = 16777216 a 2 25 = 33554432 zaokrouhlená na násobek 2 (sudé číslo)
- Celá čísla mezi 2 25 a 2 26 zaokrouhlená na násobek 4
- ...
- Celá čísla mezi 2 n a 2 n+1 kolo na násobek 2 n-23
- ...
- Celá čísla mezi 2 127 a 2 128 zaokrouhlují na násobek 2 104
- Celá čísla větší nebo rovna 2 128 jsou zaokrouhlena na „nekonečno“.
Optimalizace
Konstrukce formátu s plovoucí desetinnou čárkou umožňuje různé optimalizace, vyplývající ze snadného generování aproximace logaritmu báze 2 z celočíselného pohledu na surový bitový vzor. Celočíselná aritmetika a přesouvání bitů může přinést přiblížení k reciproční odmocnině ( rychlá inverzní odmocnina ), běžně vyžadované v počítačové grafice .
Viz také
- Standard IEEE pro aritmetiku s pohyblivou řádovou čárkou (IEEE 754)
- ISO/IEC 10967 , jazykově nezávislá aritmetika
- Primitivní datový typ
- Numerická stabilita