IEEE 754-1985 - IEEE 754-1985

IEEE 754-1985 byl průmyslovým standardem pro reprezentaci čísel s plovoucí desetinnou čárkou v počítačích , oficiálně přijat v roce 1985 a nahrazen v roce 2008 IEEE 754-2008 , a pak znovu v roce 2019 menší revizí IEEE 754-2019 . Během svých 23 let to byl nejpoužívanější formát pro výpočet s plovoucí desetinnou čárkou. Byl implementován v softwaru, ve formě knihoven s pohyblivou řádovou čárkou a v hardwaru, v instrukcích mnoha CPU a FPU . První integrovaný obvod, který implementoval návrh IEEE 754-1985, byl Intel 8087 .

IEEE 754-1985 představuje čísla v binárním formátu poskytující definice pro čtyři úrovně přesnosti, z nichž dvě nejčastěji používané jsou:

Úroveň Šířka Dosah s plnou přesností Přesnost
Jediná přesnost 32 bitů ± 1,18 × 10 - 38 až ± 3,4 × 10 38 Přibližně 7 desetinných míst
Dvojitá přesnost 64 bitů ± 2,23 × 10 - 308 až ± 1,80 × 10 308 Přibližně 16 desetinných míst

Norma také definuje reprezentace pro kladné a záporné nekonečno , „ zápornou nulu “, pět výjimek pro zpracování neplatných výsledků, jako je dělení nulou , speciální hodnoty zvané NaN pro reprezentaci těchto výjimek, denormální čísla reprezentující čísla menší, než je uvedeno výše, a čtyři zaokrouhlení režimy.

Reprezentace čísel

Číslo 0,15625 reprezentované jako číslo s plovoucí desetinnou čárkou IEEE 754-1985 s jednoduchou přesností. Vysvětlení viz text.
Tři pole v 64bitovém plováku IEEE 754

Čísla s plovoucí desetinnou čárkou ve formátu IEEE 754 se skládají ze tří polí: znaménkový bit , zkreslený exponent a zlomek. Následující příklad ilustruje význam každého z nich.

Desetinné číslo 0,15625 10 reprezentované binárně je 0,00101 2 (tj. 1/8 + 1/32). ( Dolní indexy označují číselnou základnu .) Analogicky k vědecké notaci , kde jsou čísla zapsána tak, aby měla jednu nenulovou číslici nalevo od desetinné čárky, přepíšeme toto číslo tak, aby mělo jeden 1 bit nalevo od „ binární bod “. Jednoduše vynásobíme příslušnou mocninou 2, abychom kompenzovali posunutí bitů vlevo o tři pozice:

Nyní můžeme odečíst zlomek a exponent: zlomek je 0,01 2 a exponent je −3.

Jak je znázorněno na obrázcích, tři pole v zobrazení IEEE 754 tohoto čísla jsou:

znaménko = 0, protože číslo je kladné. (1 znamená záporný.)
předpojatý exponent = −3 + „zkreslení“. V jednoduché přesnosti je zkreslení 127 , takže v tomto případě je zkreslený exponent 124; s dvojitou přesností je zkreslení 1023 , takže zkreslený exponent v tomto příkladu je 1020.
zlomek = 0,01000… 2 .

IEEE 754 přidává zkreslení k exponentu, takže čísla lze v mnoha případech pohodlně porovnávat stejným hardwarem, který porovnává celá čísla se znaménkem 2 . Při použití předpojatého exponentu vyjde menší ze dvou kladných čísel s plovoucí desetinnou čárkou „méně než“ tím větší po stejném uspořádání jako pro celá čísla se znaménkem a velikostí . Pokud mají dvě čísla s plovoucí desetinnou čárkou různá znaménka, funguje porovnání znaménka a velikosti také s předpojatými exponenty. Pokud jsou však obě čísla s plovoucí desetinnou čárkou zkresleného exponentu záporná, musí být pořadí obrácené. Pokud by exponent byl reprezentován řekněme jako číslo 2-doplněk, porovnání, aby zjistilo, které ze dvou čísel je větší, by nebylo tak pohodlné.

Úvodní 1 bit je vynechán, protože všechna čísla kromě nuly začínají úvodní 1; úvodní 1 je implicitní a ve skutečnosti není nutné jej ukládat, což poskytuje extra přesnost pro „zdarma“.

Nula

Číslo nula je reprezentováno speciálně:

znaménko = 0 pro kladnou nulu , 1 pro zápornou nulu .
předpojatý exponent = 0.
zlomek = 0.

Denormalizovaná čísla

Výše popsané reprezentace čísel se nazývají normalizované, což znamená, že implicitní úvodní binární číslice je 1. Aby se snížila ztráta přesnosti, když dojde k podtečení , IEEE 754 obsahuje schopnost reprezentovat zlomky menší, než je možné v normalizované reprezentaci, implicitní úvodní číslice a 0. Takovým číslům se říká denormální . Neobsahují tolik platných číslic jako normalizované číslo, ale umožňují postupnou ztrátu přesnosti, když výsledek aritmetické operace není přesně nula, ale je příliš blízko nule, než aby byl reprezentován normalizovaným číslem.

Denormální číslo je reprezentováno zkresleným exponentem všech 0 bitů, což představuje exponent −126 s jednoduchou přesností (ne −127) nebo −1022 ve dvojité přesnosti (ne −1023). Naproti tomu nejmenší zkreslený exponent představující normální číslo je 1 (viz příklady níže).

Reprezentace nečísel

Pole zkresleného exponentu je vyplněno všemi 1 bity, což indikuje buď nekonečno, nebo neplatný výsledek výpočtu.

Pozitivní a negativní nekonečno

Pozitivní a negativní nekonečno jsou reprezentovány takto:

znaménko = 0 pro pozitivní nekonečno, 1 pro negativní nekonečno.
předpojatý exponent = všechny 1 bity.
zlomek = všech 0 bitů.

NaN

Některé operace s aritmetikou s plovoucí desetinnou čárkou jsou neplatné, například vezmeme odmocninu ze záporného čísla. Akt dosažení neplatného výsledku se nazývá výjimka s plovoucí desetinnou čárkou . Výjimečný výsledek představuje speciální kód nazvaný NaN pro „ Not a Number “. Všechny NaN v IEEE 754-1985 mají tento formát:

znaménko = buď 0 nebo 1.
předpojatý exponent = všechny 1 bity.
zlomek = cokoli kromě všech 0 bitů (protože všech 0 bitů představuje nekonečno).

Dosah a přesnost

Relativní přesnost čísel s jednoduchou (binary32) a dvojitou přesností (binary64) ve srovnání s desetinnými reprezentacemi pomocí pevného počtu platných číslic . Relativní přesnost je zde definována jako ulp ( x )/ x , kde ulp ( x ) je jednotka na posledním místě v reprezentaci x , tj. Mezera mezi x a dalším reprezentativním číslem.

Přesnost je definována jako minimální rozdíl mezi dvěma po sobě následujícími reprezentacemi mantis; jde tedy o funkci pouze v mantise; zatímco mezera je definována jako rozdíl mezi dvěma po sobě jdoucími čísly.

Jediná přesnost

Čísla s jednou přesností zabírají 32 bitů. S jedinou přesností:

  • Kladná a záporná čísla nejblíže nule (reprezentovaná denormalizovanou hodnotou se všemi 0 s v poli exponent a binární hodnotou 1 v poli zlomku) jsou
    ± 2 −23 × 2 −126 ≈ ± 1,40130 × 10 −45
  • Kladná a záporná normalizovaná čísla nejblíže nule (reprezentovaná binární hodnotou 1 v poli exponent a 0 v poli zlomku) jsou
    ± 1 × 2 −126 ≈ ± 1,17549 × 10 −38
  • Konečná kladná a konečná záporná čísla nejdále od nuly (reprezentovaná hodnotou s 254 v poli exponent a všemi 1 s ve zlomkovém poli) jsou
    ± (2−2 −23 ) × 2 127 ≈ ± 3,40282 × 10 38

Některé příklady hodnot rozsahu a mezery pro dané exponenty s jednoduchou přesností:

Skutečný exponent (nezaujatý) Exp (zaujatý) Minimální Maximum Mezera
-1 126 0,5 ≈ 0,999999940395 ≈ 5,96046e-8
0 127 1 ≈ 1,999999880791 ≈ 1,19209e-7
1 128 2 ≈ 3,999999761581 ≈ 2,38419e-7
2 129 4 ≈ 7,999999523163 ≈ 4,76837e-7
10 137 1024 ≈ 2047,999877930 ≈ 1,22070e-4
11 138 2048 ≈ 4095,999755859 ≈ 2,44141e-4
23 150 8388608 16777215 1
24 151 16777216 33554430 2
127 254 ≈ 1,70141e38 ≈ 3,40282e38 ≈ 2,02824e31

Například 16 777 217 nelze kódovat jako 32bitový float, protože bude zaokrouhleno na 16 777 216. To ukazuje, proč aritmetika s pohyblivou řádovou čárkou není pro účetní software vhodná. Všechna celá čísla v reprezentativním rozsahu, která jsou mocninou 2, však lze uložit do 32bitového floatu bez zaokrouhlování.

Dvojitá přesnost

Čísla s dvojitou přesností zabírají 64 bitů. S dvojitou přesností:

  • Kladná a záporná čísla nejblíže nule (reprezentovaná denormalizovanou hodnotou se všemi 0 s v poli Exp a binární hodnotou 1 v poli Frakce) jsou
    ± 2 −52 × 2 −1022 ≈ ± 4,94066 × 10 −324
  • Kladná a záporná normalizovaná čísla nejblíže nule (reprezentovaná binární hodnotou 1 v poli Exp a 0 v poli zlomku) jsou
    ± 1 x 2 -1022 ≈ ± 2,22507 x 10 -308
  • Konečná kladná a konečná záporná čísla nejdále od nuly (reprezentovaná hodnotou 2046 v poli Exp a všemi 1 s ve zlomkovém poli) jsou
    ± (2−2 −52 ) × 2 1023 ≈ ± 1,79769 × 10 308

Některé příklady hodnot rozsahu a mezery pro dané exponenty s dvojitou přesností:

Skutečný exponent (nezaujatý) Exp (zaujatý) Minimální Maximum Mezera
-1 1022 0,5 ≈ 0,999999999999999888978 ≈ 1,11022e-16
0 1023 1 ≈ 1,999999999999999777955 ≈ 2,22045e-16
1 1024 2 ≈ 3,999999999999999555911 ≈ 4,44089e-16
2 1025 4 ≈ 7,999999999999999111822 ≈ 8,88178e-16
10 1033 1024 ≈ 2047,99999999999977772626 ≈ 2,27374e-13
11 1034 2048 ≈ 4095,999999999999545253 ≈ 4,54747e-13
52 1075 4503599627370496 9007199254740991 1
53 1076 9007199254740992 18014398509481982 2
1023 2046 ≈ 8,98847e307 ≈ 1,79769e308 ≈ 1,99584e292

Rozšířené formáty

Norma také doporučuje použít rozšířené formáty k provádění interních výpočtů s vyšší přesností, než je požadováno pro konečný výsledek, aby se minimalizovaly chyby zaokrouhlení: norma pro tyto formáty uvádí pouze minimální požadavky na přesnost a exponent. X87 80-bit rozšířený formát je nejčastěji realizován rozšířený formát, který splňuje tyto požadavky.

Příklady

Zde je několik příkladů reprezentací IEEE 754 s jednou přesností:

Typ Podepsat Skutečný exponent Exp (zaujatý) Pole exponentu Frakční pole Hodnota
Nula 0 −126 0 0000 0000 000 0000 0000 0000 0000 0000 0,0
Záporná nula 1 −126 0 0000 0000 000 0000 0000 0000 0000 0000 −0,0
Jeden 0 0 127 0111 1111 000 0000 0000 0000 0000 0000 1,0
Mínus jedna 1 0 127 0111 1111 000 0000 0000 0000 0000 0000 −1,0
Nejmenší denormalizované číslo * −126 0 0000 0000 000 0000 0000 0000 0000 0001 ± 2 −23 × 2 −126 = ± 2 −149 ≈ ± 1,4 × 10 - 45
„Střední“ denormalizované číslo * −126 0 0000 0000 100 0000 0000 0000 0000 0000 ± 2 -1 x 2 -126 = ± 2 -127 ≈ ± 5,88 x 10 - 39
Největší denormalizované číslo * −126 0 0000 0000 111 1111 1111 1111 1111 1111 ± (1-2 -23 ) x 2 -126 ≈ ± 1,18 x 10 - 38
Nejmenší normalizované číslo * −126 1 0000 0001 000 0000 0000 0000 0000 0000 ± 2 -126 ≈ ± 1,18 x 10 - 38
Největší normalizované číslo * 127 254 1111 1110 111 1111 1111 1111 1111 1111 ± (2−2 −23 ) × 2 127 ≈ ± 3,4 × 10 38
Pozitivní nekonečno 0 128 255 1111 1111 000 0000 0000 0000 0000 0000 +∞
Negativní nekonečno 1 128 255 1111 1111 000 0000 0000 0000 0000 0000 −∞
Ne číslo * 128 255 1111 1111 nenulová NaN
* Signální bit může být buď 0 nebo 1.

Porovnávání čísel s plovoucí desetinnou čárkou

Každá možná bitová kombinace je buď NaN, nebo číslo s jedinečnou hodnotou v afinně rozšířeném systému reálných čísel s přidruženým pořadím, kromě dvou kombinací bitů pro zápornou nulu a kladnou nulu, které někdy vyžadují zvláštní pozornost (viz níže) . Binární reprezentace má tu zvláštní vlastnost, že s výjimkou Nans jakékoliv dvě čísla lze přirovnat jako znaménko a velikost čísel ( endianness otázky poplatek). Při porovnávání jako celých čísel 2-komplementu : Pokud se znaménkové bity liší, záporné číslo předchází kladnému číslu, takže doplněk 2 dává správný výsledek (kromě toho, že záporná nula a kladná nula by měly být považovány za stejné). Pokud jsou obě hodnoty kladné, srovnání komplementu 2 opět poskytne správný výsledek. V opačném případě (dvě záporná čísla) je správné pořadí FP opakem pořadí doplňků 2.

Chyby zaokrouhlení spojené s výpočty s plovoucí desetinnou čárkou mohou omezit použití srovnání pro kontrolu přesné rovnosti výsledků. Výběr přijatelného rozsahu je složité téma. Běžnou technikou je použít k porovnání srovnání hodnotu epsilon. V závislosti na tom, jak shovívavá jsou srovnání, běžné hodnoty zahrnují 1e-6nebo 1e-5pro jednoduchou přesnost a 1e-14pro dvojitou přesnost. Další běžnou technikou je ULP, která kontroluje rozdíl mezi číslicemi posledního místa a efektivně kontroluje, kolik kroků je od těchto dvou hodnot.

Ačkoli záporná nula a kladná nula jsou pro účely srovnání obecně považovány za stejné, některé relační operátory programovacích jazyků a podobné konstrukce je považují za odlišné. Podle Java Language Specification, srovnávání a rovností operátoři s nimi zacházet jako se rovnat, ale i odlišit (oficiálně začíná s Java verze 1.1, ale ve skutečnosti se 1.1.1), stejně jako metody srovnání , a to i tříd a . Math.min()Math.max()equals()compareTo()compare()FloatDouble

Zaokrouhlování čísel s plovoucí desetinnou čárkou

Standard IEEE má čtyři různé režimy zaokrouhlování; první je výchozí; ostatním se říká směrované zaokrouhlování .

  • Zaokrouhlit na nejbližší - zaokrouhlí na nejbližší hodnotu; pokud číslo klesne uprostřed, zaokrouhlí se na nejbližší hodnotu sudým (nulovým) nejméně významným bitem, což znamená, že je zaokrouhleno 50% času (v IEEE 754-2008 se tento režim nazývá roundTiesToEven, aby se odlišil od jiného kola -do-nejbližší režim)
  • Zaokrouhlit směrem k 0 - směrované zaokrouhlení směrem k nule
  • Zaokrouhlit směrem k +∞ - směrované zaokrouhlení směrem k kladnému nekonečnu
  • Zaokrouhlit směrem k −∞ - směrované zaokrouhlení směrem k zápornému nekonečnu.

Rozšíření reálných čísel

Standard IEEE využívá (a rozšiřuje) afinitně rozšířený systém reálných čísel s oddělenými kladnými a zápornými nekonečny. Během navrhování byl předložen návrh standardu, který by začlenil projektivně rozšířený systém reálných čísel s jediným nekonečnem bez znaménka tím, že programátorům poskytne možnost výběru režimu. V zájmu snížení složitosti finálního standardu byl však projektivní režim zrušen. Na Intel 8087 a Intel 80287 s plovoucí desetinnou čárkou spolupracovníci procesory jak podpořit tento projektivní režim.

Funkce a predikáty

Standardní operace

Musí být zajištěny následující funkce:

  • Sčítat, odčítat, násobit, dělit
  • Odmocnina
  • Zbytek s pohyblivou řádovou čárkou. Není to jako normální modulo operace , může to být záporné pro dvě kladná čísla. Vrátí přesnou hodnotu x– (zaokrouhleno (x/y) · y) .
  • Zaokrouhlete na nejbližší celé číslo . Pro neorientované zaokrouhlení, když je na půli cesty mezi dvěma celými čísly, je vybráno sudé celé číslo.
  • Srovnávací operace. Kromě zjevnějších výsledků definuje IEEE 754, že −∞ = −∞, +∞ = +∞ a x  ≠  NaNpro jakékoli x (včetně NaN).

Doporučené funkce a predikáty

  • copysign(x,y)vrací x se znaménkem y, takže se abs(x)rovná copysign(x,1.0). Jedná se o jednu z mála operací, které na NaN působí způsobem podobným aritmetice. Tato funkce copysignje ve standardu C99 nová.
  • −x vrací x se znaménkem obráceným. To se v některých případech liší od 0 − x, zejména když x je 0. Takže - (0) je −0, ale znaménko 0−0 závisí na režimu zaokrouhlování.
  • scalb(y, N)
  • logb(x)
  • finite(x)predikát pro „x je konečná hodnota“, což odpovídá -INF <x <Inf
  • isnan(x) predikát pro „x je NaN“, což odpovídá „x ≠ x“
  • x <> y, což se ukazuje, že má jiné chování než NOT (x = y) kvůli NaN.
  • unordered(x, y) platí, když „x je neuspořádáno s y“, tj. buď x nebo y je NaN.
  • class(x)
  • nextafter(x,y) vrací další reprezentovatelnou hodnotu od x ve směru k y

Dějiny

V roce 1976 Intel zahájil vývoj koprocesoru s plovoucí desetinnou čárkou . Intel doufal, že bude schopen prodat čip obsahující dobré implementace všech operací nacházejících se v široce se měnících knihovnách matematického softwaru.

John Palmer, který projekt řídil, je přesvědčil, aby se pokusili vyvinout standard pro všechny své operace s pohyblivou řádovou čárkou. Kontaktoval Williama Kahana z Kalifornské univerzity , který pomohl zlepšit přesnost kalkulaček Hewlett-Packard . Kahan navrhl, aby Intel použil plovoucí desetinnou čárku VAX společnosti Digital Equipment Corporation (DEC). První VAX, VAX-11/780 , právě vyšel na konci roku 1977 a jeho plovoucí bod byl vysoce ceněn. Ve snaze prodat svůj čip na co nejširším trhu chtěl Intel co nejlepší plovoucí desetinnou čárku a Kahan pokračoval ve vypracovávání specifikací. Kahan původně doporučil, aby základna s plovoucí desetinnou čárkou byla desetinná, ale hardwarový design koprocesoru byl příliš daleko na to, aby se tato změna provedla.

Práce v rámci společnosti Intel znepokojovala ostatní dodavatele, kteří vyvinuli úsilí o standardizaci, aby zajistili „rovné podmínky“. Kahan se zúčastnil druhého setkání pracovní skupiny pro standardy IEEE 754, které se konalo v listopadu 1977. Zde dostal povolení od společnosti Intel, aby předložil návrh návrhu na základě standardní aritmetické části jejich návrhu pro koprocesor; bylo mu dovoleno vysvětlit návrhová rozhodnutí společnosti Intel a jejich základní úvahy, ale nikoli cokoli související s implementační architekturou společnosti Intel.

Protože 8bitový exponent nebyl dostatečně široký pro některé operace požadované pro čísla s dvojitou přesností, např. Pro uložení produktu dvou 32bitových čísel, Kahanův návrh i protinávrh DEC proto používaly 11 bitů, jako je čas. -tested 60-bit formátu s plovoucí desetinnou čárkou z CDC 6600 z roku 1965. návrh Kahan je také stanoveno nekonečna, které jsou užitečné, pokud se jedná o dělení nulou podmínek; hodnoty nečísla, které jsou užitečné při řešení neplatných operací; denormální čísla , která pomáhají zmírňovat problémy způsobené podtečením; a lépe vyvážený exponent zkreslení , které může pomoci zabránit přetečení a podtečení při převrácení čísla.

Ještě před schválením implementovala návrh normy řada výrobců. Intel 8087, který byl oznámen v roce 1980, byl prvním čipem, který implementoval návrh standardu.

Koprocesor s plovoucí desetinnou čárkou Intel 8087

V roce 1980 byl již vydán čip Intel 8087 , ale DEC zůstával proti, zejména vůči denormálním číslům, kvůli problémům s výkonem a protože by to DEC poskytlo konkurenční výhodu při standardizaci formátu DEC.

Argumenty ohledně postupného podtečení trvaly až do roku 1981, kdy se expert najatý DEC, aby jej vyhodnotil, postavil proti disidentům. Společnost DEC nechala vypracovat studii, aby prokázala, že postupné přetékání je špatný nápad, ale studie dospěla k opačnému závěru a DEC ustoupila. V roce 1985 byla norma ratifikována, ale o rok dříve se de facto stala standardem, implementováno mnoha výrobci.

Viz také

Poznámky

Reference

Další čtení

externí odkazy