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

V oblasti výpočetní techniky je čtyřnásobná přesnost (nebo čtyřnásobná přesnost ) binární formát počítačového čísla s plovoucí desetinnou čárkou , který zabírá 16 bytů (128 bitů) s přesností nejméně dvojnásobnou oproti 53bitové dvojité přesnosti .

Tato 128bitová čtyřnásobná přesnost je navržena nejen pro aplikace vyžadující výsledky s vyšší než dvojnásobnou přesností, ale také jako primární funkce umožňuje spolehlivější a přesnější výpočet výsledků s dvojitou přesností minimalizací přetečení a zaokrouhlování chyb v mezilehlých výpočty a scratch proměnné. William Kahan , hlavní architekt původního standardu IEEE-754 s plovoucí desetinnou čárkou, poznamenal: „V současné době je 10bajtový rozšířený formát přijatelným kompromisem mezi hodnotou mimořádně přesné aritmetiky a cenou za její rychlé spuštění; velmi brzy dvě více bytů přesnosti se stane snesitelnými a nakonec 16bajtovým formátem ... Tento druh postupné evoluce směrem k širší přesnosti byl již v dohledu, když byl sestaven standard IEEE 754 pro aritmetiku s pohyblivou řádovou čárkou. “

V IEEE 754-2008 je 128bitový formát base-2 oficiálně označován jako binary128 .

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

Standard IEEE 754 specifikuje binary128 jako mající:

To dává přesnost od 33 do 36 platných desetinných číslic. Pokud je desetinný řetězec s nejvýše 33 platnými číslicemi převeden na reprezentaci čtyřnásobné přesnosti 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 č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, konečný výsledek se musí shodovat s původním číslem.

Formát je zapsán s implicitním bitem olova s ​​hodnotou 1, pokud není exponent uložen se všemi nulami. V paměťovém formátu se tedy objeví pouze 112 bitů významu , ale celková přesnost je 113 bitů (přibližně 34 desetinných číslic: log 10 (2 113 ) ≈ 34,016 ). Bity jsou rozloženy jako:

Znaménkový bit, 15bitový exponent a 112bitový význam

Binary256 by mít mantisy přesnost 237 bitů (přibližně 71 desetinná místa) a exponent zkreslení 262143.

Kódování exponentů

Čtyřnásobně přesný binární exponent s plovoucí desetinnou čárkou je kódován pomocí offsetové binární reprezentace, přičemž nulový offset je 16383; toto je také známé jako exponent zkreslení ve standardu IEEE 754.

  • E min = 0001 16 - 3FFF 16 = −16382
  • E max = 7FFE 16 - 3FFF 16 = 16383
  • Zkreslení exponentu = 3FFF 16 = 16383

Jak je tedy definováno ofsetovou binární reprezentací, aby se získal skutečný exponent, musí být offset 16383 odečten od uloženého exponentu.

Uložené exponenty 0000 16 a 7FFF 16 jsou interpretovány speciálně.

Exponent Významná nula Významné nenulové Rovnice
0000 16 0 , -0 subnormální čísla (−1) signbit × 2 −16382 × 0. Signifikantní bitů 2
0001 16 , ..., 7FFE 16 normalizovaná hodnota (-1) signbit × 2 exponentbity 2 - 16383 × 1. signifikantní bity 2
7FFF 16 ± NaN (tichý, signalizace)

Minimální přísně kladná (subnormální) hodnota je 2 −16494 ≈ 10 −4965 a má přesnost pouze jeden bit. 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 2 16384 - 2 162711,1897 × 10 4932 .

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

Tyto příklady jsou uvedeny v bitové reprezentaci hodnoty s plovoucí desetinnou čárkou v šestnáctkové soustavě . 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
                                            (smallest positive subnormal number)
0000 ffff ffff ffff ffff ffff ffff ffff16 = 2−16382 × (1 − 2−112)
                                          ≈ 3.3621031431120935062626778173217519551 × 10−4932
                                            (largest subnormal number)
0001 0000 0000 0000 0000 0000 0000 000016 = 2−16382
                                          ≈ 3.3621031431120935062626778173217526026 × 10−4932
                                            (smallest positive normal number)
7ffe ffff ffff ffff ffff ffff ffff ffff16 = 216383 × (2 − 2−112)
                                          ≈ 1.1897314953572317650857593266280070162 × 104932
                                            (largest normal number)
3ffe ffff ffff ffff ffff ffff ffff ffff16 = 1 − 2−113
                                          ≈ 0.9999999999999999999999999999999999037
                                            (largest number less than one)
3fff 0000 0000 0000 0000 0000 0000 000016 = 1 (one)
3fff 0000 0000 0000 0000 0000 0000 000116 = 1 + 2−112
                                          ≈ 1.0000000000000000000000000000000001926
                                            (smallest number larger than one)
c000 0000 0000 0000 0000 0000 0000 000016 = −2
0000 0000 0000 0000 0000 0000 0000 000016 = 0
8000 0000 0000 0000 0000 0000 0000 000016 = −0
7fff 0000 0000 0000 0000 0000 0000 000016 = infinity
ffff 0000 0000 0000 0000 0000 0000 000016 = −infinity
4000 921f b544 42d1 8469 898c c517 01b816 ≈ π
3ffd 5555 5555 5555 5555 5555 5555 555516 ≈ 1/3

Ve výchozím nastavení se 1/3 zaokrouhluje dolů jako dvojnásobná přesnost kvůli lichému počtu bitů v mantinelu. Bity za bodem zaokrouhlení jsou 0101...tedy menší než 1/2 jednotky na posledním místě .

Dvojitá-dvojitá aritmetika

Běžné softwarové technice k implementaci téměř čtyřnásobné přesnosti pomocí dvojic hodnot s dvojnásobnou přesností se někdy říká dvojitá dvojitá aritmetika . Pomocí párů hodnot dvojnásobné přesnosti IEEE s 53bitovými významy poskytuje dvojitá aritmetika operace s čísly s významy alespoň 2 × 53 = 106 bitů (ve skutečnosti 107 bitů s výjimkou některých největších hodnot, kvůli omezenému exponentu rozsah), jen o málo 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 dvojnásobnou přesností, protože exponent má stále 11 bitů, což je výrazně nižší než 15bitový exponent čtyřnásobné přesnosti IEEE (rozsah 1,8 × 10 308 pro double-double versus 1,2 × 10 4932 pro binární128).

Zejména hodnota q s dvojitou dvojitou/čtyřnásobnou přesností je v technice dvojité dvojité reprezentována implicitně jako součet q = x + y dvou hodnot dvojité přesnosti x a y , z nichž každá dodává polovinu významů q . To znamená, že dvojice ( x , y ) je uložena na místo q a operace s hodnotami q (+, -, ×, ...) jsou transformovány do ekvivalentních (ale komplikovanějších) operací s hodnotami x a y . Aritmetika v této technice se tedy redukuje na sekvenci operací s dvojitou přesností; protože aritmetika s dvojitou přesností je běžně implementována v hardwaru, dvojitá dvojitá aritmetika je obvykle podstatně rychlejší než obecnější aritmetické techniky s libovolnou přesností .

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

  • S klesající velikostí hodnoty klesá i 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 ... 0 2 (106 nul) × 2 −1074 , nebo 1 000 ... 0 2 (106 nul) × 2 −968 . Čísla, jejichž velikost je menší než 2 - 1021 , nebudou mít ve srovnání s dvojnásobnou přesností další přesnost.
  • Skutečný počet bitů přesnosti se může lišit. Obecně platí, že velikost části nižšího řádu není větší než polovina ULP části vyššího řádu. Pokud je část nízkého řádu menší než polovina ULP části vyššího řádu, jsou mezi významnou z hodnot vyššího řádu a nižšího řádu implikovány významné bity (buď všechny 0 s, nebo všechny 1 s). Některé algoritmy, které spoléhají na to, že mají pevný počet bitů v významu, mohou při použití 128bitových dlouhých dvojitých čísel selhat.
  • 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é aritmetiky je také možné generovat aritmetiku trojnásobnou nebo čtyřnásobnou, pokud je požadována vyšší přesnost bez jakékoli vyšší přesnosti knihovny s pohyblivou řádovou čárkou. Jsou reprezentovány jako součet tří (nebo čtyř) hodnot s dvojitou přesností. Mohou představovat operace s alespoň 159/161 a 212/215 bity.

Podobnou techniku ​​lze použít k vytvoření aritmetiky s dvojitou čtyřkou , která je reprezentována jako součet dvou hodnot čtyřnásobné přesnosti. Mohou představovat operace s alespoň 226 (nebo 227) bity.

Implementace

Čtyřnásobná přesnost je v softwaru často implementována různými technikami (jako je technika dvojitého dvojitého výše, ačkoli tato technika neimplementuje čtyřnásobnou přesnost IEEE), protože přímá hardwarová podpora pro čtyřnásobnou přesnost je od roku 2016 méně obvyklá (viz. „ Hardwarová podpora “ níže). K získání čtyřnásobné (nebo vyšší) přesnosti lze použít obecné aritmetické knihovny s libovolnou přesností, ale specializované implementace s čtyřnásobnou přesností mohou dosáhnout vyššího výkonu.

Podpora počítačového jazyka

Samostatnou otázkou je, do jaké míry jsou čtyřnásobně přesné typy přímo začleněny do počítačových programovacích jazyků .

Čtyřnásobný přesnost je uvedeno v Fortran podle real(real128)(modul iso_fortran_envz Fortran 2008 musí být použit, konstanta real128je rovna 16 na většině procesorů), nebo jak je real(selected_real_kind(33, 4931)), nebo v nestandardním způsobem REAL*16. (Čtyřnásobná přesnost REAL*16je podporována například kompilátorem Intel Fortran a kompilátorem GNU Fortran na architekturách x86 , x86-64 a Itanium .)

Pro programovací jazyk C specifikuje ISO/IEC TS 18661-3 (rozšíření s plovoucí desetinnou čárkou pro C, výměny a rozšířené typy) _Float128jako typ implementující formát čtyřnásobné přesnosti IEEE 754 (binary128). Alternativně v C / C ++ s několika systémy a kompilátory může být čtyřnásobná přesnost specifikována dlouhým dvojitým typem, ale to není vyžadováno jazykem (který vyžaduje pouze to, aby long doublebyl alespoň tak přesný jako double), ani není běžné.

Na x86 a x86-64 implementují nejběžnější kompilátory C/C ++ long doublebuď 80bitovou rozšířenou přesnost (např. GNU C Compiler gcc a Intel C ++ kompilátor s /Qlong‑doublepřepínačem), nebo jednoduše jako synonyma s dvojitou přesností (např. Microsoft Visual C ++ ), spíše než jako čtyřnásobná přesnost. Standard volání procedur pro 64bitovou architekturu ARM (AArch64) určuje, že long doubleodpovídá formátu čtyřnásobné přesnosti IEEE 754. Na několika dalších architekturách některé kompilátory C/C ++ implementují long doublejako čtyřnásobnou přesnost, např. Gcc na PowerPC (jako double-double) a SPARC , nebo kompilátory Sun Studio na SPARC. I když long doubleto není čtyřnásobná přesnost, některé kompilátory C/C ++ poskytují jako rozšíření nestandardní typ s čtyřnásobnou přesností. Například gcc poskytuje typ se čtyřnásobnou přesností, který se nazývá __float128pro procesory x86, x86-64 a Itanium , a na PowerPC jako 128bitový IEEE s plovoucí desetinnou čárkou pomocí možností -mfloat128-hardware nebo -mfloat128; a některé verze kompilátoru C/C ++ společnosti Intel pro x86 a x86-64 dodávají nestandardní typ s názvem čtyřnásobná přesnost _Quad.

Knihovny a sady nástrojů

  • GCC quad přesná matematická knihovna, libquadmath , poskytuje __float128a __complex128operace.
  • Knihovna Boost multiprecision Boost.Multiprecision poskytuje sjednocené multiplatformní rozhraní C ++ pro __float128a _Quadtypy a obsahuje vlastní implementaci standardní matematické knihovny.
  • Multiprecision Computing Toolbox pro MATLAB umožňuje čtyřnásobné přesné výpočty v MATLABu . Obsahuje základní aritmetické funkce a numerické metody, hustou a řídkou lineární algebru.
  • Balíček DoubleFloats poskytuje podporu pro dvojnásobné výpočty pro programovací jazyk Julia.
  • Knihovna doubledouble.py umožňuje v Pythonu výpočty double-double.
  • Mathematica podporuje čísla se čtyřmi přesnostmi IEEE: 128bitové hodnoty s plovoucí desetinnou čárkou (Real128) a 256bitové komplexní hodnoty (Complex256).

Hardwarová podpora

Čtyřnásobná přesnost IEEE byla přidána do IBM S/390 G5 v roce 1998 a je podporována hardwarem v následujících procesorech z/Architecture . CPU IBM POWER9 ( Power ISA 3.0 ) má nativní 128bitovou hardwarovou podporu.

Nativní podpora 128bitových plováků IEEE je definována v PA-RISC 1.0 a v architekturách SPARC V8 a V9 (např. Existuje 16 registrů quad-precision %q0, %q4, ...), ale žádný procesor SPARC implementuje quad- přesné operace v hardwaru od roku 2004.

Rozšířená přesnost jiné než IEEE (128 bitů úložiště, 1 znakový bit, 7 exponentních bitů, 112 zlomkových bitů, 8 bitů nepoužíváno) byla přidána do řady IBM System/370 (70. až 80. léta 20. století) a byla k dispozici na některých S/360 modely v šedesátých letech (S/360-85, -195 a další na zvláštní požadavek nebo simulované softwarem OS).

VAX procesor provedena non-IEEE čtyřnásobného přesností plovoucí bod jako jeho „plovoucí desetinnou čárkou H“ formátu. Mělo to jeden znakový bit, 15bitový exponent a 112-zlomkové bity, nicméně rozložení v paměti se výrazně lišilo od čtyřnásobné přesnosti IEEE a také se lišilo zastoupení exponentů. Pouze několik prvních procesorů VAX implementovalo pokyny H Floating-Point v hardwaru, všechny ostatní emulovaly H Floating-Point v softwaru.

Architektura RISC-V specifikuje rozšíření „Q“ (quad-precision) pro 128bitovou binární aritmetiku s plovoucí desetinnou čárkou IEEE 754-2008. Rozšíření „L“ (zatím ne certifikované) bude určovat 64bitovou a 128bitovou desetinnou čárku.

Hardwarová implementace se čtyřnásobnou přesností (128bitová) by neměla být zaměňována s „128bitovými FPU“, které implementují instrukce SIMD , jako například Streaming SIMD Extensions nebo AltiVec , což označuje 128bitové vektory čtyř 32bitových jednodruhových nebo dvě 64bitové hodnoty s dvojitou přesností, které jsou provozovány současně.

Viz také

Reference

externí odkazy