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á.

IEEE 754 binární formát s plovoucí desetinnou čárkou s jednoduchou přesností: binary32

Standard IEEE 754 specifikuje binary32 jako mající:

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ě:

Float example.svg

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.

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é

Reference

externí odkazy