Čtyřnásobný přesný formát s plovoucí desetinnou čárkou - Quadruple-precision floating-point format

v výpočetní, čtyřnásobná přesnost (nebo quad přesnost) je binární plovoucí bod -na základě formát čísla počítače který zabírá 16 bajtů (128 bitů) s přesností více než dvakrát vyšší než 53 bitů dvojnásobná přesnost.

Tato 128bitová čtyřnásobná přesnost je určena nejen pro aplikace vyžadující výsledky s vyšší než dvojnásobnou přesností,[1] ale také jako primární funkce umožnit spolehlivější a přesnější výpočet výsledků dvojí přesnosti minimalizací přetečení a chyby zaokrouhlování v mezilehlých výpočtech a pomocných proměnných. William Kahan, primární architekt původního standardu s plovoucí desetinnou čárkou IEEE-754, poznamenal: „Prozatím 10bajtový rozšířený formát je přijatelný kompromis mezi hodnotou mimořádně přesné aritmetiky a cenou jejího rychlého provedení; velmi brzy se stanou snesitelnými další dva bajty přesnosti a nakonec 16bajtový formát ... Tento druh postupného vývoje směrem k širší přesnosti byl již k dispozici, když Standard IEEE 754 pro aritmetiku s plovoucí desetinnou čárkou bylo zarámováno. “[2]

v IEEE 754-2008 128bitový formát base-2 se oficiálně označuje jako binary128.

Čtyřnásobný přesný binární formát s plovoucí desetinnou čárkou IEEE 754: binary128

Standard IEEE 754 specifikuje a binary128 jako mající:

To dává přesnost od 33 do 36 platných desetinných míst. Pokud se desetinný řetězec s nejvýše 33 platnými číslicemi převede na reprezentaci čtyřnásobné přesnosti IEEE 754 a poté se převede zpět na desetinný řetězec se stejným počtem číslic, měl by se konečný výsledek shodovat s původním řetězcem. Pokud je číslo čtyřnásobné přesnosti IEEE 754 převedeno na desetinný řetězec s alespoň 36 platnými číslicemi a poté převedeno zpět na reprezentaci čtyřnásobné přesnosti, musí se konečný výsledek shodovat s původním číslem.[3]

Formát je zapisován implicitním bitem olova s ​​hodnotou 1, pokud exponent není uložen se všemi nulami. Tedy pouze 112 bitů významně se zobrazí ve formátu paměti, ale celková přesnost je 113 bitů (přibližně 34 desetinných míst: log10(2113) ≈ 34.016). Bity jsou rozloženy jako:

Znakový bit, 15bitový exponent a 112bitový význam

A binary256 bude mít významnou přesnost 237 bitů (přibližně 71 desetinných míst) a zkreslení exponentu 262143.

Kódování komponent

Binární exponent s plovoucí desetinnou čárkou se čtyřnásobnou přesností je kódován pomocí offset binární reprezentace, s nulovým posunem 16383; toto je také známé jako zkreslení exponentů ve standardu IEEE 754.

Jak je definováno binárním vyjádřením posunutí, aby se získal skutečný exponent, je třeba od uloženého exponenta odečíst posun 16383.

Uložené exponenty 000016 a 7FFF16 jsou interpretovány speciálně.

ExponentVýznamná nulaVýznamná nenulováRovnice
0000160, −0podnormální čísla(−1)signbit × 2−16382 × 0.významnébity2
000116, ..., 7FFE16normalizovaná hodnota(−1)signbit × 2exponentbity2 − 16383 × 1.významnébity2
7FFF16±NaN (tichý, signalizační)

Minimální přísně kladná (podnormální) hodnota je 2−16494 ≈ 10−4965 a má přesnost pouze jednoho bitu. Minimální kladná normální hodnota je 2−163823.3621 × 10−4932 a má přesnost 113 bitů, tj. ± 2−16494 také. Maximální reprezentativní hodnota je 216384 − 2162711.1897 × 104932.

Čtyřnásobné příklady přesnosti

Tyto příklady jsou uvedeny v bitech zastoupení, v hexadecimální, hodnoty s plovoucí desetinnou čárkou. To zahrnuje znaménko, (zkreslený) exponent a význam.

0000 0000 0000 0000 0000 0000 0000 000116 = 2−16382 × 2−112 = 2−16494                                          ≈ 6.4751751194380251109244389582276465525 × 10−4966                                            (nejmenší kladné podnormální číslo)
0000 ffff ffff ffff ffff ffff ffff ffff16 = 2−16382 × (1 − 2−112)                                          ≈ 3.3621031431120935062626778173217519551 × 10−4932                                            (největší podnormální číslo)
0001 0000 0000 0000 0000 0000 0000 000016 = 2−16382                                          ≈ 3.3621031431120935062626778173217526026 × 10−4932                                            (nejmenší kladné normální číslo)
7ff ffff ffff ffff ffff ffff ffff ffff16 = 216383 × (2 − 2−112)                                          ≈ 1.1897314953572317650857593266280070162 × 104932                                            (největší normální číslo)
3ffe ffff ffff ffff ffff ffff ffff ffff16 = 1 − 2−113                                          ≈ 0,9999999999999999999999999999999999037 (největší číslo menší než jedna)
3fff 0000 0000 0000 0000 0000 0000 000016 = 1 (jeden)
3fff 0000 0000 0000 0000 0000 0000 000116 = 1 + 2−112                                          ≈ 1,0000000000000000000000000000000001926 (nejmenší číslo větší než jedna)
c000 0000 0000 0000 0000 0000 0000 000016 = −2
0000 0000 0000 0000 0000 0000 0000 000016 = 08000 0000 0000 0000 0000 0000 0000 000016 = −0
7fff 0000 0000 0000 0000 0000 0000 000016 = infinityffff 0000 0000 0000 0000 0000 0000 000016 = − Nekonečno
4000 921f b544 42d1 8469 898c c517 01b816 ≈ π
3ffd 5555 5555 5555 5555 5555 5555 555516 ≈ 1/3

Ve výchozím nastavení 1/3 zaokrouhluje dolů jako dvojnásobná přesnost, kvůli lichému počtu bitů v mantinelu. Takže bity za bodem zaokrouhlování jsou 0101... což je méně než 1/2 a jednotka na posledním místě.

Dvojitá dvojitá aritmetika

Běžná softwarová technika pro implementaci téměř čtyřnásobné přesnosti páry z dvojnásobná přesnost hodnoty se někdy nazývá dvojitá dvojitá aritmetika.[4][5][6] Pomocí dvojic hodnot IEEE s dvojitou přesností s 53bitovými významy může dvojitá dvojitá aritmetika představovat operace s alespoň[4] 2 × 53 = 106-bitový význam (ve skutečnosti 107 bitů[7] až na některé z největších hodnot, kvůli omezenému rozsahu exponentů), jen o něco méně přesný než 113bitový význam čtyřnásobné přesnosti IEEE binary128. Rozsah double-double zůstává v podstatě stejný jako formát s dvojitou přesností, protože exponent má stále 11 bitů,[4] výrazně nižší než 15bitový exponent čtyřnásobné přesnosti IEEE (rozsah 1.8 × 10308 pro dvojí-dvojí versus 1.2 × 104932 pro binary128).

Zejména hodnota dvojité-dvojité / čtyřnásobné přesnosti q v technice double-double je implicitně reprezentován jako součet q = X + y dvou hodnot s dvojitou přesností X a y, z nichž každý dodává polovinu qmá význam.[5] To znamená, že dvojice (X, y) je uložen místo qa operace na q hodnoty (+, −, ×, ...) jsou transformovány do ekvivalentních (ale složitějších) operací na X a y hodnoty. Aritmetika v této technice se tedy redukuje na posloupnost operací s dvojitou přesností; protože aritmetika s dvojitou přesností je běžně implementována v hardwaru, je dvojitá aritmetika obvykle podstatně rychlejší než obecnější aritmetika s libovolnou přesností techniky.[4][5]

Všimněte si, že dvojitá dvojitá aritmetika má následující speciální vlastnosti:[8]

  • Jak se velikost hodnoty zmenšuje, snižuje se také množství mimořádné přesnosti. Proto je nejmenší číslo v normalizovaném rozsahu užší než dvojnásobná přesnost. Nejmenší číslo s plnou přesností je 1000...02 (106 nul) × 2−1074nebo 1.000...02 (106 nul) × 2−968. Čísla, jejichž velikost je menší než 2−1021 nebude mít další přesnost ve srovnání s dvojitou přesností.
  • Skutečný počet bitů přesnosti se může lišit. Obecně velikost části řádu nižšího řádu není větší než polovina ULP části řádu vyššího řádu. Pokud je část nízkého řádu menší než polovina ULP části vysokého řádu, jsou mezi významnými čísly vysokého řádu a nízkého řádu implikovány významné bity (buď všechny 0 nebo všechny 1). Určité algoritmy, které se spoléhají na to, že v pevném čísle mají pevný počet bitů, mohou selhat při použití 128bitových dlouhých dvojitých čísel.
  • Z výše uvedeného důvodu je možné reprezentovat hodnoty jako 1 + 2−1074, což je nejmenší reprezentovatelné číslo větší než 1.

Kromě dvojité dvojité aritmetiky je také možné generovat trojitou dvojitou nebo čtyřnásobnou aritmetiku, pokud je vyžadována vyšší přesnost bez jakékoli knihovny s vyšší přesností s plovoucí desetinnou čárkou. Jsou reprezentovány jako součet tří (nebo čtyř) hodnot s dvojitou přesností. Mohou představovat operace s minimálně 159/161 bitů a 212/215 bitů.

Podobnou techniku ​​lze použít k výrobě a aritmetika dvou čtverců, který je reprezentován jako součet dvou hodnot čtyřnásobné přesnosti. Mohou představovat operace s alespoň 226 (nebo 227) bity.[9]

Implementace

Čtyřnásobná přesnost se v softwaru často implementuje různými technikami (například technikou dvojitého dvojitého provedení výše, ačkoli tato technika neimplementuje čtyřnásobnou přesnost IEEE), protože přímá hardwarová podpora čtyřnásobné přesnosti je od roku 2016 méně častá (viz "Hardwarová podpora "níže). Lze použít obecné aritmetika s libovolnou přesností knihovny pro získání čtyřnásobné (nebo vyšší) přesnosti, ale specializované implementace čtyřnásobné přesnosti mohou dosáhnout vyššího výkonu.

Počítačová jazyková podpora

Samostatnou otázkou je, do jaké míry jsou typy čtyřnásobné přesnosti přímo začleněny do počítače programovací jazyky.

Čtyřnásobná přesnost je uvedena v Fortran podle skutečný (real128) (modul iso_fortran_env musí být použita konstanta z Fortranu 2008 skutečné128 se rovná 16 na většině procesorů), nebo jako real (selected_real_kind (33, 4931)), nebo nestandardním způsobem jako SKUTEČNÉ * 16. (Čtyřnásobná přesnost SKUTEČNÉ * 16 je podporován Překladač Intel Fortran[10] a podle GNU Fortran překladač[11] na x86, x86-64, a Itanium například architektury.)

Pro Programovací jazyk C. Specifikuje ISO / IEC TS 18661-3 (rozšíření s plovoucí desetinnou čárkou pro C, interchange a rozšířené typy) _Float128 jako typ implementující čtyřnásobný přesný formát IEEE 754 (binary128).[12] Případně v C /C ++ s několika systémy a kompilátory může čtyřnásobná přesnost určit dlouhý dvojitý typ, ale jazyk to nevyžaduje (což vyžaduje pouze dlouhý dvojitý být alespoň tak přesný jako dvojnásobek), ani to není běžné.

Na x86 a x86-64 jsou implementovány nejběžnější kompilátory C / C ++ dlouhý dvojitý buď jako 80bitové rozšířená přesnost (např Překladač GNU C. gcc[13] a Překladač Intel C ++ s / Qlong-double přepínač[14]) nebo jednoduše jako synonymum dvojité přesnosti (např. Microsoft Visual C ++[15]), spíše než jako čtyřnásobná přesnost. Standard volání procedury pro 64bitová architektura ARM (AArch64) to určuje dlouhý dvojitý odpovídá formátu IEEE 754 se čtyřnásobnou přesností.[16] Na několika dalších architekturách implementují některé překladače C / C ++ dlouhý dvojitý jako čtyřnásobná přesnost, např. gcc zapnuto PowerPC (jako double-double[17][18][19]) a SPARC,[20] nebo Překladače Sun Studio na SPARC.[21] I kdyby dlouhý dvojitý není čtyřnásobná přesnost, nicméně některé překladače C / C ++ poskytují nestandardní typ čtyřnásobné přesnosti jako rozšíření. Například gcc poskytuje typ čtyřnásobné přesnosti s názvem __float128 pro x86, x86-64 a Itanium CPU,[22] a dál PowerPC jako 128bitový IEEE s plovoucí desetinnou čárkou pomocí možností -mfloat128-hardware nebo -mfloat128;[23] a některé verze kompilátoru Intel C / C ++ pro x86 a x86-64 dodávají nestandardní typ čtyřnásobné přesnosti s názvem _Quad.[24]

Knihovny a panely nástrojů

  • The GCC čtyřprecizní matematická knihovna, libquadmath, poskytuje __float128 a __complex128 operace.
  • The Zvýšit multiprecision library Boost.Multiprecision poskytuje jednotné multiplatformní C ++ rozhraní pro __float128 a _Quad typů a zahrnuje vlastní implementaci standardní matematické knihovny.[25]
  • Sada nástrojů Multiprecision Computing Toolbox pro MATLAB umožňuje výpočty se čtyřnásobnou přesností MATLAB. Zahrnuje základní aritmetické funkce i numerické metody, hustou a řídkou lineární algebru.[26]
  • DoubleDouble[27] balíček poskytuje podporu pro zdvojnásobení výpočtů pro programovací jazyk Julia.
  • Doubledouble.py[28] knihovna umožňuje dvojité a dvojité výpočty v Pythonu.
  • Mathematica podporuje čísla IEEE quad-precision: 128bitové hodnoty s plovoucí desetinnou čárkou (Real128) a 256bitové komplexní hodnoty (Complex256).[Citace je zapotřebí ]

Hardwarová podpora

Do IBM byla přidána čtyřnásobná přesnost IEEE S / 390 G5 v roce 1998,[29] a je v dalším podporován hardwarem z / Architektura procesory.[30][31] IBM SÍLA9 PROCESOR (Napájení ISA 3.0 ) má nativní 128bitovou hardwarovou podporu.[23]

Nativní podpora 128bitových plováků IEEE je definována v PA-RISC 1.0,[32] a v SPARC V8[33] a V9[34] architektury (např. existuje 16 čtyřpřesných registrů% q0,% q4, ...), ale žádný procesor SPARC neimplementuje čtyřpřesné operace v hardwaru od roku 2004.[35]

Non-IEEE extended-precision (128 bit úložiště, 1 znakový bit, 7 exponentový bit, 112 zlomkový bit, 8 bitů nepoužito) byl přidán do Systém IBM / 370 série (70. – 80. léta) a u některých modelů S / 360 byla k dispozici v 60. letech (S / 360-85,[36] -195 a další na zvláštní požadavek nebo simulované softwarem OS).

The VAX procesor implementoval plovoucí desetinnou čárku se čtyřnásobnou přesností než IEEE ve formátu „H Floating-point“. Mělo to jeden znakový bit, 15bitový exponent a 112 zlomkové bity, nicméně rozložení v paměti se významně lišilo od čtyřnásobné přesnosti IEEE a odchylka exponentu se také lišila. Pouze několik prvních procesorů VAX implementovalo instrukce H s plovoucí desetinnou čárkou v hardwaru, všechny ostatní emulovaly H s plovoucí desetinnou čárkou v softwaru.

Hardwarová implementace čtyřnásobné přesnosti (128 bitů) by neměla být zaměňována s implementací „128bitových FPU“ SIMD pokyny, jako např Streamování rozšíření SIMD nebo AltiVec, který odkazuje na 128-bit vektory čtyř 32bitových hodnot s jednou přesností nebo dvou 64bitových hodnot s dvojitou přesností, které jsou provozovány současně.

Viz také

Reference

  1. ^ David H. Bailey; Jonathan M. Borwein (6. července 2009). „Vysoce přesný výpočet a matematická fyzika“ (PDF).
  2. ^ Higham, Nicholas (2002). „Navrhování stabilních algoritmů“ v oblasti přesnosti a stability numerických algoritmů (2. vydání). SIAM. p. 43.
  3. ^ William Kahan (1. října 1987). „Přednáškové poznámky o stavu normy IEEE 754 pro binární aritmetiku s plovoucí desetinnou čárkou“ (PDF).
  4. ^ A b C d Yozo Hida, X. Li a D. H. Bailey, Quad-Double Arithmetic: Algorithms, Implementation, and Application, Technická zpráva Lawrence Berkeley National Laboratory LBNL-46996 (2000). Také Y. Hida et al., Knihovna pro dvojitou a dvojitou aritmetiku (2007).
  5. ^ A b C J. R. Shewchuk, Adaptivní přesná aritmetika s pohyblivou řádovou čárkou a rychlé a robustní geometrické predikáty, Discrete & Computational Geometry 18: 305-363, 1997.
  6. ^ Knuth, D. E. Umění počítačového programování (2. vyd.). kapitola 4.2.3. problém 9.
  7. ^ Robert Munafo F107 a F161 vysoce přesné datové typy s plovoucí desetinnou čárkou (2011).
  8. ^ 128bitový dlouhý datový typ s dvojitou pohyblivou řádovou čárkou
  9. ^ sourceware.org Re: Stav glibc libm
  10. ^ „Stručná informace o produktu Intel Fortran Compiler (archivovaná kopie na web.archive.org)“ (PDF). Ne. Archivovány od originálu 25. října 2008. Citováno 2010-01-23.CS1 maint: unfit url (odkaz)
  11. ^ „Série vydání GCC 4.6 - změny, nové funkce a opravy“. Citováno 2010-02-06.
  12. ^ „ISO / IEC TS 18661-3“ (PDF). 2015-06-10. Citováno 2019-09-22.
  13. ^ Možnosti i386 a x86-64 (archivovaná kopie na web.archive.org), Používání kolekce kompilátorů GNU.
  14. ^ Intel Developer Site
  15. ^ Domovská stránka MSDN, o kompilátoru Visual C ++
  16. ^ „Standard volání procedur pro 64bitovou architekturu ARM (AArch64)“ (PDF). 2013-05-22. Archivovány od originál (PDF) dne 16. 10. 2019. Citováno 2019-09-22.
  17. ^ Možnosti RS / 6000 a PowerPC, Používání kolekce kompilátorů GNU.
  18. ^ Inside Macintosh - Numerika PowerPC Archivováno 9. října 2012 na adrese Wayback Machine
  19. ^ 128bitové rutiny dvojité podpory pro Darwina
  20. ^ Možnosti SPARC, Používání kolekce kompilátorů GNU.
  21. ^ Matematické knihovny, Sun Studio 11 Průvodce numerickými výpočty (2005).
  22. ^ Další plovoucí typy, Pomocí kolekce kompilátorů GNU
  23. ^ A b „Série vydání GCC 6 - změny, nové funkce a opravy“. Citováno 2016-09-13.
  24. ^ Fóra Intel C ++ (2007).
  25. ^ „Boost.Multiprecision - float128“. Citováno 2015-06-22.
  26. ^ Pavel Holoborodko (2013-01-20). "Rychlé čtyřnásobné přesné výpočty v MATLABu". Citováno 2015-06-22.
  27. ^ „DoubleDouble.jl“.
  28. ^ "doubledouble.py".
  29. ^ Schwarz, E. M .; Krygowski, C. A. (září 1999). „Jednotka s plovoucí desetinnou čárkou S / 390 G5“. IBM Journal of Research and Development. 43 (5/6): 707–721. doi:10.1147 / rd.435.0707. Citováno 10. října 2020.
  30. ^ Gerwig, G. a Wetter, H. a Schwarz, E. M. a Haess, J. a Krygowski, C. A. a Fleischer, B. M. a Kroener, M. (květen 2004). „Jednotka s plovoucí desetinnou čárkou IBM eServer z990. IBM J. Res. Dev. 48; str. 311-322“.CS1 maint: více jmen: seznam autorů (odkaz)
  31. ^ Eric Schwarz (22. června 2015). „Akcelerátory IBM z13 SIMD pro celé číslo, řetězec a plovoucí desetinnou čárku“ (PDF). Citováno 13. července 2015.
  32. ^ Podpora implementátoru pro binární výměnné formáty
  33. ^ SPARC Architecture Manual: Verze 8 (archivovaná kopie na web.archive.org) (PDF). SPARC International, Inc. 1992. Archivováno od originál (PDF) dne 04.02.2005. Citováno 2011-09-24. SPARC je architektura sady instrukcí (ISA) s 32bitovým celým číslem a 32-, 64- a 128bitovými IEEE Standard 754 s plovoucí desetinnou čárkou jako hlavními datovými typy.
  34. ^ David L. Weaver; Tom Germond, vyd. (1994). SPARC Architecture Manual: Verze 9 (archivovaná kopie na web.archive.org) (PDF). SPARC International, Inc. Archivováno od originál (PDF) dne 18.01.2012. Citováno 2011-09-24. Floating-point: The architecture provides an IEEE 754-compatible floating-point instruction set, working on a separate register file that provides 32 single-precision (32-bit), 32 double-precision (64-bit), 16 quad-precision (128bitové) registry nebo jejich směs.
  35. ^ „Chování a implementace SPARC“. Průvodce numerickými výpočty - Sun Studio 10. Sun Microsystems, Inc. 2004. Citováno 2011-09-24. Existují však čtyři situace, kdy hardware úspěšně nedokončí instrukci s plovoucí desetinnou čárkou: ... Instrukce není hardwarem implementována (například ... instrukce se čtyřmi přesnostmi na jakékoli SPARC FPU).
  36. ^ Padegs A (1968). "Strukturální aspekty systému System / 360 Model 85, III: Rozšíření architektury s plovoucí desetinnou čárkou". IBM Systems Journal. 7: 22–29. doi:10,1147 / sj.71.0022.

externí odkazy