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
Čí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
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-6
nebo 1e-5
pro jednoduchou přesnost a 1e-14
pro 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()
Float
Double
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 ≠
NaN
pro jakékoli x (včetněNaN
).
Doporučené funkce a predikáty
-
copysign(x,y)
vrací x se znaménkem y, takže seabs(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 funkcecopysign
je 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.
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é
- IEEE 754
- Minifloat pro jednoduché příklady vlastností čísel s plovoucí desetinnou čárkou IEEE 754
- Aritmetika s pevným bodem
Poznámky
Reference
Další čtení
- Charles Severance (březen 1998). „IEEE 754: Rozhovor s Williamem Kahanem“ (PDF) . Počítač IEEE . 31 (3): 114–115. doi : 10,1109/MC.1998.660194 . S2CID 33291145 . Archivováno z originálu (PDF) dne 2009-08-23 . Citováno 2008-04-28 .
- David Goldberg (březen 1991). „Co by měl každý počítačový vědec vědět o aritmetice s pohyblivou řádovou čárkou“ (PDF) . Výpočetní průzkumy ACM . 23 (1): 5–48. doi : 10,1145/103162,103163 . S2CID 222008826 . Citováno 2008-04-28 .
- Chris Hecker (únor 1996). „Pojďme k (plovoucímu) bodu“ (PDF) . Časopis Game Developer : 19–24. ISSN 1073-922X . Archivováno z originálu (PDF) dne 2007-02-03.
- David Monniaux (květen 2008). „Úskalí ověřování výpočtů s plovoucí desetinnou čárkou“ . Transakce ACM v programovacích jazycích a systémech . 30 (3): 1–41. arXiv : cs/0701192 . doi : 10,1145/1353445,1353446 . ISSN 0164-0925 . S2CID 218578808 .: Kompendium neintuitivního chování s plovoucí desetinnou čárkou v populárních architekturách s důsledky pro ověřování a testování programu.