Rozšířená přesnost - Extended precision

Rozšířená přesnost se týká formátů čísel s plovoucí desetinnou čárkou, které poskytují větší přesnost než základní formáty s plovoucí desetinnou čárkou. Rozšířené přesné formáty podporují základní formát minimalizací chyb zaokrouhlování a přetečení v mezilehlých hodnotách výrazů v základním formátu. Na rozdíl od rozšířené přesnosti , výpočty s libovolnou přesností se týká implementace mnohem větší číselné typy (s počtem úložiště, které obvykle není síla dva) pomocí speciálního software (nebo, zřídka, hardware).

Rozšířené přesné implementace

Existuje dlouhá historie rozšířených formátů s plovoucí desetinnou čárkou sahající téměř do poloviny minulého století. Různí výrobci použili různé formáty pro prodloužení přesnosti pro různé stroje. V mnoha případech formát rozšířené přesnosti není úplně stejný jako zvětšení běžných formátů s jednoduchou a dvojitou přesností, které má rozšířit. V několika případech byla implementace pouze softwarovou změnou v datovém formátu s plovoucí desetinnou čárkou, ale ve většině případů byla rozšířená přesnost implementována v hardwaru, buď vestavěném v samotném centrálním procesoru , nebo častěji zabudovaném v hardwaru volitelný, připojený procesor nazývaný „ jednotka s plovoucí desetinnou čárkou “ (FPU) nebo „procesor s plovoucí desetinnou čárkou“ ( FPP ), přístupný CPU jako rychlé vstupní / výstupní zařízení.

Rozšířené přesné formáty IBM

IBM 1130 , prodaný v roce 1965 nabídl dva formáty s plovoucí desetinnou čárkou: formát 32-bit "standardní přesnost" a formát 40-bit "rozšířená přesnost". Standardní přesnost formát obsahuje 24bitové dvojkového doplňku significand zatímco rozšířená přesnost využívá 32bitovou dvojkového doplňku significand. Druhý formát plně využívá 32bitové celočíselné operace CPU. Charakteristikou v obou formátech je 8bitové pole obsahující sílu dvou předpětí 128. Aritmetické operace s pohyblivou řádovou čárkou jsou prováděny softwarem a dvojitá přesnost není vůbec podporována. Rozšířený formát zabírá tři 16bitová slova, přičemž místo navíc je jednoduše ignorováno.

360 IBM System / podporuje formát 32-bit "short" plovoucí desetinnou čárkou a 64-bit "long" Formát s plovoucí desetinnou čárkou. 360/85 a navazující System/370 přidávají podporu pro 128bitový „rozšířený“ formát. Tyto formáty jsou stále podporovány v aktuálním designu , kde se nyní nazývají formáty „ hexadecimální plovoucí desetinnou čárkou “ (HFP).

Rozšířený přesný formát Microsoft MBF

Microsoft BASIC port pro 6502 CPU, jako je tomu v úpravách, jako Commodore BASIC , Applesoft BASIC , KIM-1 BASIC nebo MicroTAN BASIC , podporuje rozšířené 40bitové varianty tohoto formátu s plovoucí desetinnou čárkou Microsoft binární formát (MBF) od roku 1977.

Rozšířené přesné formáty IEEE 754

Standard IEEE 754 s plovoucí desetinnou čárkou doporučuje, aby implementace poskytovaly rozšířené přesné formáty. Norma specifikuje minimální požadavky na rozšířený formát, ale neurčuje kódování. Kódování je volbou implementátora.

IA32 , x86-64 a Itanium procesory podporují 80-bitové "Dvojitý" rozšířený přesné formátu s 64-bit mantisy. Intel 8087 matematický koprocesor byl první x86 zařízení, které podporovány s plovoucí desetinnou čárkou aritmetické v hardwaru. Byl navržen tak, aby podporoval 32bitový formát „s jednou přesností“ a 64bitový formát „s dvojitou přesností“ pro kódování a výměnu čísel s plovoucí desetinnou čárkou. Dočasný skutečný (rozšířený) formát byl navržen tak, aby neukládal data s vyšší přesností jako takovou, ale spíše primárně umožnil spolehlivější a přesnější výpočet dvojitých výsledků minimalizací přetečení a chyb zaokrouhlování při mezilehlých výpočtech. Například mnoho algoritmů s plovoucí desetinnou čárkou (např. Umocňování ) trpí značnou ztrátou přesnosti při výpočtu pomocí nejpřímějších implementací. Aby se tyto problémy zmírnily, byly interní registry v 8087 navrženy tak, aby obsahovaly mezivýsledky v 80bitovém formátu „rozšířené přesnosti“. 8087 automaticky převádí čísla do tohoto formátu při načítání registrů s plovoucí desetinnou čárkou z paměti a také převádí výsledky zpět do běžnějších formátů při ukládání registrů zpět do paměti. Aby bylo možné ukládat mezilehlé výsledky subexprese do rozšířených přesných scratch proměnných a pokračovat napříč příkazy programovacího jazyka a jinak přerušovat výpočty, aby se obnovilo tam, kde byly přerušeny, poskytuje instrukce, které přenášejí hodnoty mezi těmito interními registry a pamětí bez provedení jakéhokoli převodu, což umožňuje přístup k rozšířenému formátu pro výpočty - také oživuje problém přesnosti funkcí takových čísel, ale s vyšší přesností.

Tyto plovoucí desetinnou čárkou jednotky (FPU) na všech následných x86 procesory podporují tento formát. Výsledkem je vývoj softwaru, který využívá vyšší přesnosti, kterou tento formát poskytuje. William Kahan , hlavní konstruktér aritmetiky x87 a původního standardního návrhu IEEE 754, uvádí k vývoji x87 s plovoucí desetinnou čárkou: „Byl zahrnut rozšířený formát tak široký, jak jsme si troufli (80 bitů), aby plnil stejnou podpůrnou roli jako 13 desetinný interní formát slouží v 10 desítkových kalkulačkách Hewlett-Packard. “ Kahan navíc poznamenává, že 64 bitů byl nejširší význam, v němž bylo možné šíření přenosu provést bez prodloužení doby cyklu na 8087, a že rozšířená přesnost x87 byla navržena tak, aby byla v budoucích procesorech rozšiřitelná na vyšší přesnost: „Zatím 10 -byte Extended format je přijatelný kompromis mezi hodnotou mimořádně přesné aritmetiky a cenou za její rychlé spuštění; brzy budou tolerovatelné další dva bajty přesnosti a nakonec 16bajtový formát ... Tento druh postupný vývoj směrem k širší přesnosti byl již v dohledu, když byl sestaven standard IEEE 754 pro aritmetiku s pohyblivou řádovou čárkou. “

Tyto Motorola 6888x matematické koprocesory a Motorola 68040 a 68060 procesory podporovat stejný 64-bit mantisy rozšířený přesnost (podobný formátu Intel i čalouněná, aby 96-bitového formátu s 16 nevyužitých bitů vložených mezi exponent a mantisy polí). Následné procesory Coldfire nepodporují tento 96bitový rozšířený přesný formát.

Matematický koprocesor FPA10 pro rané procesory ARM také podporuje tento rozšířený typ přesnosti (podobný formátu Intel, i když je vyplněn 96bitovým formátem se 16 nulovými bity vloženými mezi pole se znaménkem a poli exponentu), ale bez správného zaokrouhlování.

80bitové formáty x87 a Motorola 68881 splňují požadavky dvojnásobně rozšířeného formátu IEEE 754, stejně jako 128bitový formát IEEE 754 .

Rozšířený přesný formát x86

Rozšířený přesný formát x86 je 80bitový formát, který byl poprvé implementován v matematickém koprocesoru Intel 8087, a je podporován všemi procesory, které jsou založeny na návrhu x86 a obsahují jednotku s plovoucí desetinnou čárkou (FPU). Tento 80bitový formát používá jeden bit pro znaménko významu, 15 bitů pro pole exponent (tj. Stejný rozsah jako 128bitový čtyřnásobný přesný formát IEEE 754 ) a 64 bitů pro význam. Pole exponent je předpjato číslem 16383, což znamená, že 16383 musí být odečteno od hodnoty v poli exponent pro výpočet skutečného výkonu 2. Hodnota pole exponentu 32767 (všech patnáct bitů 1 ) je vyhrazena, aby byla umožněna reprezentace speciálních stavů, jako je nekonečno a není číslo . Pokud je pole exponent nula, hodnota je denormální číslo a exponent 2 je −16382.

X86 Extended Floating Point Format.svg

V následující tabulce „ s “ je hodnota znaménkového bitu (0 znamená kladný, 1 znamená záporný), „ e “ je hodnota pole exponentu interpretovaného jako kladné celé číslo a „ m “ je význam interpretovaný jako kladné binární číslo, kde je binární bod umístěn mezi bity 63 a 62. Pole " m " je kombinací celých čísel a zlomkových částí ve výše uvedeném diagramu.

Interpretace polí hodnoty x86 Extended Precision
Exponent Významné Význam
Všechny nuly Bit 63 Bity 62-0
Nula Nula Nula. Znaménkový bit dává znaménko nuly.
Nenulové Denormální. Hodnota je (−1) s × m × 2 −16382
Jeden Cokoliv Pseudo denormální. 80387 a novější tuto hodnotu správně interpretují, ale nevygenerují ji. Hodnota je (−1) s × m × 2 −16382
Všichni Bity 63,62 Bity 61-0
00 Nula Pseudo-nekonečno. Znaménkový bit udává znak nekonečna. 8087 a 80287 to považují za nekonečno. 80387 a novější to považují za neplatný operand.
Nenulové Pseudo není číslo. Znaménkový bit nemá smysl. 8087 a 80287 to považují za signalizaci ne číslo. 80387 a novější to považují za neplatný operand.
01 Cokoliv Pseudo není číslo. Znaménkový bit nemá smysl. 8087 a 80287 to považují za signalizaci ne číslo. 80387 a novější to považují za neplatný operand.
10 Nula Nekonečno. Znaménkový bit udává znak nekonečna. 8087 a 80287 to považují za signalizaci ne číslo. Koprocesory 8087 a 80287 používaly pseudonekonečnou reprezentaci pro nekonečna.
Nenulové Signalizace není číslo, bit bitů nemá smysl.
11 Nula Neurčitý s pohyblivou řádovou čárkou, výsledek neplatných výpočtů, jako je odmocnina záporného čísla, logaritmus záporného čísla, 0/0, nekonečno / nekonečno, nekonečno krát 0 a další, když byl procesor nakonfigurován tak, aby nevytvářel výjimky pro neplatné operandy. Znaménkový bit nemá smysl. Toto je zvláštní případ Tichého, nikoli čísla.
Nenulové Tiché ani číslo, znaménkový bit nemá smysl. 8087 a 80287 to považují za signalizaci ne číslo.
Všechny ostatní hodnoty Bit 63 Bity 62-0
Nula Cokoliv Neobvyklé. Generováno pouze na 8087 a 80287. 80387 a novější to považují za neplatný operand. Hodnota je (−1) s × m × 2 e −16383
Jeden Cokoliv Normalizovaná hodnota. Hodnota je (−1) s × m × 2 e −16383

Na rozdíl od formátů s jednoduchou a dvojitou přesností tento formát nepoužívá implicitní/ skrytý bit . Bit 63 spíše obsahuje celočíselnou část významu a bity 62-0 drží zlomkovou část. Bit 63 bude 1 na všech normalizovaných číslech. Když byl 8087 vyvíjen, měl tento design několik výhod :

  • Výpočty lze dokončit o něco rychleji, pokud jsou v registru přítomny všechny bity významu.
  • 64bitový význam poskytuje dostatečnou přesnost, aby se předešlo ztrátě přesnosti, když jsou výsledky v mnoha případech převedeny zpět do formátu s dvojitou přesností.
  • Tento formát poskytuje mechanismus pro indikaci ztráty přesnosti v důsledku podtečení, kterou lze provádět dalšími operacemi. Například výpočet 2 x 10 -4930 x 3 x 10 -10 x 4 x 10 20 generuje mezivýsledek 6 x 10 -4940 , která je denormal a také zahrnuje přesné ztráty. Součin všech výrazů je 24 × 10–4920, což lze vyjádřit jako normalizované číslo. 80287 mohl dokončit tento výpočet a uvést ztrátu přesnosti vrácením „nenormální“ výsledek (exponent není 0, bit 63 = 0). Procesory od 80387 již negenerují neobvyklé a nepodporují neobvyklé vstupy do operací. Budou generovat denormal, pokud dojde k podtečení, ale vygenerují normalizovaný výsledek, pokud lze normalizovat následné operace na denormal.

Úvod k použití

80bitový formát s plovoucí desetinnou čárkou byl široce dostupný do roku 1984, po vývoji jazyků C, Fortran a podobných počítačových jazyků, které zpočátku nabízely pouze běžné velikosti s 32 a 64bitovou plovoucí desetinnou čárkou. Na konstrukci x86 většina kompilátorů C nyní podporuje 80bitovou rozšířenou přesnost pomocí dlouhého dvojitého typu, což bylo specifikováno v normách C99 / C11 (aritmetika s pohyblivou řádovou čárkou IEC 60559 (příloha F)). Kompilátory na x86 pro jiné jazyky často podporují také prodlouženou přesnost, někdy prostřednictvím nestandardních rozšíření: například Turbo Pascal nabízí extendedtyp a několik kompilátorů FortranREAL*10typ (analogický s REAL*4a REAL*8). Takové kompilátory také typicky obsahují matematické podprogramy s rozšířenou přesností , jako jsou odmocniny a goniometrické funkce , ve svých standardních knihovnách .

Pracovní rozsah

80bitový formát s plovoucí desetinnou čárkou má rozsah (včetně subnormálů ) od přibližně 3,65 × 10–4951 do 1,18 × 10 4932 . Ačkoli log 10 (2 64 ) ≅ 19,266, tento formát je obvykle popisován tak, že poskytuje přibližně osmnáct platných číslic přesnosti ( minimální hodnota logu 10 (2 63 ), minimální zaručená přesnost). Použití desítkové soustavy, když mluvíme o binárních, je nešťastné, protože většina desetinných zlomků jsou opakující se sekvence v binárních, stejně jako 2/3 jsou v desítkové soustavě. Hodnota jako 10,15 je tedy reprezentována binárně jako ekvivalent 10,1499996185 atd. V desítkové soustavě pro SKUTEČNÉ*4, ale 10,15000000000000035527 atd. v REAL*8: interkonverze bude zahrnovat aproximaci kromě těch několika desetinných zlomků, které představují přesnou binární hodnotu, například 0,625. Pro REAL*10 je desetinný řetězec 10,1499999999999999996530553 atd. Posledních 9 číslic je osmnáctá zlomková číslice, a tedy dvacátá významná číslice řetězce. Hranice při převodu mezi desítkovou a binární pro 80bitový formát lze zadat následovně: pokud je desetinný řetězec s nejvýše 18 platnými číslicemi správně zaokrouhlen na 80bitovou binární hodnotu s plovoucí desetinnou čárkou IEEE 754 (jako na vstupu), pak převedeno zpět na stejný počet platných desetinných číslic (jako pro výstup), pak bude konečný řetězec přesně odpovídat originálu; zatímco naopak, pokud je 80bitová binární hodnota s plovoucí desetinnou čárkou IEEE 754 správně převedena a (nejbližší) zaokrouhlena na desetinný řetězec s alespoň 21 platnými desetinnými číslicemi, pak převedena zpět do binárního formátu, bude přesně odpovídat originálu. Tyto aproximace jsou obzvláště problematické při určování nejlepší hodnoty konstant ve vzorcích na vysokou přesnost, jak lze vypočítat pomocí aritmetiky s libovolnou přesností .

Potřeba 80bitového formátu

Pozoruhodným příkladem potřeby minimálně 64 bitů přesnosti ve smyslu formátu rozšířené přesnosti je potřeba vyhnout se ztrátě přesnosti při provádění umocňování hodnot s dvojitou přesností . Jednotky s plovoucí desetinnou čárkou x86 neposkytují instrukci, která přímo provádí umocnění . Místo toho poskytují sadu instrukcí, které program může použít v pořadí k provedení umocnění pomocí rovnice:

Aby se předešlo ztrátě přesnosti, musí být mezivýsledky „ log 2 ( x ) “ a „ y · log 2 ( x ) “ vypočítány s mnohem vyšší přesností, protože ve skutečnosti musí exponent i významná pole x zapadat do významné pole mezivýsledku. Následně se při výpočtu 2 mezivýsledků rozdělí významné pole průběžného výsledku mezi pole exponent a významná pole konečného výsledku . Následující diskuse popisuje tento požadavek podrobněji.

S trochou vybalení může být hodnota IEEE 754 s dvojitou přesností reprezentována jako:

kde s je znak exponentu (buď 0 nebo 1), E je nezaujatý exponent, což je celé číslo v rozsahu od 0 do 1023, a M je význam, což je 53bitová hodnota, která spadá do rozsahu 1 ≤ M <2 . Záporná čísla a nula lze ignorovat, protože logaritmus těchto hodnot není definován. Pro účely této diskuse M nemá 53 bitů přesnosti, protože je omezena na větší nebo rovnou jedné, tj. Skrytý bit se do přesnosti nepočítá (Všimněte si, že v situacích, kde M je menší než 1, hodnota je ve skutečnosti je to normální, a proto již může dojít ke ztrátě přesnosti. Tato situace je mimo rozsah tohoto článku).

Převzetí protokolu této reprezentace čísla s dvojitou přesností a zjednodušení výsledků v následujících případech:

Tento výsledek ukazuje, že když vezmeme základ 2 logaritmu čísla, znaménko exponentu původní hodnoty se stane znaménkem logaritmu, exponent původní hodnoty se stane celočíselnou součástí významu logaritmu a významem původní hodnota je transformována do zlomkové části významu logaritmu.

Protože E je celé číslo v rozsahu 0 až 1023, je pro reprezentaci celočíselné části logaritmu zapotřebí až 10 bitů nalevo od bodu radixu. Protože M spadá do rozsahu 1 ≤ M <2 , hodnota log 2 M bude spadat do rozsahu 0 ≤ log 2 M <1, takže napravo od bodu radixu je zapotřebí alespoň 52 bitů, které představují zlomkovou část logaritmus. Kombinace 10 bitů nalevo od bodu radixu s 52 bity napravo od bodu radixu znamená, že významná část logaritmu musí být vypočítána s přesností alespoň 62 bitů. V praxi hodnoty M menší než vyžadují 53 bitů napravo od bodu radixu a hodnoty M menší než vyžadují 54 bitů napravo od bodu radixu, aby se předešlo ztrátě přesnosti. Vyvažováním tohoto požadavku na zvýšení přesnosti napravo od bodu radixu vyžadují exponenty menší než 512 pouze 9 bitů nalevo od bodu radixu a exponenty menší než 256 vyžadují pouze 8 bitů nalevo od bodu radixu.

Poslední část výpočtu umocnění je výpočet 2 mezivýsledků . „Mezivýsledek“ se skládá z celočíselné části „ I “ přidané do zlomkové části „ F “. Pokud je mezivýsledek záporný, je k získání kladné zlomkové části zapotřebí mírné úpravy, protože „ I “ i „ F “ jsou záporná čísla.

Pro pozitivní průběžné výsledky:

Pro negativní průběžné výsledky:

Celá část mezivýsledku („ I “ nebo „ I −1 “) plus zkreslení se tedy stane exponentem konečného výsledku a transformovaná kladná zlomková část průběžného výsledku: 2 F nebo 2 1+ F se stane významem konečný výsledek. Aby bylo možné do konečného výsledku dodat přesnost 52 bitů, musí být kladná zlomková část udržována alespoň na 52 bitů.

Závěrem lze říci, že přesný počet bitů přesnosti potřebných v meziprocesu je do určité míry závislý na datech, ale 64 bitů je dostačujících k tomu, aby se předešlo ztrátě přesnosti v drtivé většině výpočtů umocňování zahrnujících čísla s dvojitou přesností .

Počet bitů potřebných pro exponent formátu rozšířené přesnosti vyplývá z požadavku, aby součin dvou čísel s dvojitou přesností nepřekročil při výpočtu pomocí rozšířeného formátu. Největší možný exponent hodnoty s dvojnásobnou přesností je 1023, takže exponent největšího možného součinu dvou čísel s dvojnásobnou přesností je 2047 (11bitová hodnota). Přidání předpojatosti k účtování negativních exponentů znamená, že pole exponentu musí být široké alespoň 12 bitů.

Kombinace těchto požadavků: 1 bit pro znaménko, 12 bitů pro zkreslený exponent a 64 bitů pro význam znamená, že formát rozšířené přesnosti bude potřebovat alespoň 77 bitů. Technické úvahy vyústily v konečnou definici 80bitového formátu (zejména norma IEEE 754 vyžaduje, aby rozsah exponentů rozšířeného přesného formátu odpovídal následujícímu největšímu, čtyřnásobnému , přesnému formátu, který je 15 bitů).

Dalším příkladem výpočtů, které těží z rozšířené aritmetiky přesnosti, jsou iterativní schémata upřesnění , používaná k nepřímému čištění chyb nahromaděných v přímém řešení během typicky velmi velkého počtu výpočtů provedených pro numerickou lineární algebru.

Jazyková podpora

  • Některé implementace C / C ++ (např. GNU Compiler Collection (GCC), Clang , Intel C ++ ) implementují long doublepomocí 80bitových čísel s plovoucí desetinnou čárkou na systémech x86. Toto je však chování definované implementací a není vyžadováno, ale je povoleno normou, jak je specifikováno pro hardware IEEE 754 ve standardu C99 „Aritmetika s plovoucí desetinnou čárkou přílohy F IEC 60559“. GCC také poskytuje __float80a __float128typy.
  • Některé implementace Common Lisp (např. CMU Common Lisp , Embeddable Common Lisp ) implementují long-floatpomocí 80bitových čísel s plovoucí desetinnou čárkou na systémech x86.
  • Implementace programovacího jazyka Dreal využívající hardwarově největší velikost s plovoucí desetinnou čárkou, 80 bitů pro x86 procesory nebo dvojitou přesnost, podle toho, která hodnota je větší.
  • Object Pascal ( Delphi ) má kromě Single (32-bit) a Double (64-bit), Extended (80-bit pro tradiční 32-bit cíle, ačkoli polstrování a platforma může měnit velikost ).
  • Racket run-time systém poskytuje 80-bitový datový extflonum na systémech x86.
  • Swift standardní knihovna poskytuje Float80datový typ.
  • PowerBASIC základní kompilátor poskytuje EXTnebo EXTENDED10 bajtů Rozšířená přesností plovoucí desetinnou čárkou datový typ.

Viz také

Poznámky pod čarou

Reference