Format zmiennoprzecinkowy o poczwórnej precyzji — Quadruple-precision floating-point format

W obliczeniowej , poczwórne precyzji (lub precyzji quad ) jest binarny zmiennoprzecinkowy -na komputer format numeru , który zajmuje 16 bajtów (128 bitów) z dokładnością przynajmniej dwukrotnie z 53-bitowym podwójnej precyzji .

Ta 128-bitowa poczwórna precyzja jest przeznaczona nie tylko do zastosowań wymagających wyników o wyższej niż podwójna precyzja, ale również, jako główna funkcja, umożliwia bardziej niezawodne i dokładne obliczanie wyników o podwójnej precyzji poprzez minimalizację błędów przepełnienia i zaokrąglenia w pośrednich obliczenia i zmienne zarysowania. William Kahan , główny architekt oryginalnego standardu zmiennoprzecinkowego IEEE-754, zauważył: „Na razie 10-bajtowy format rozszerzony jest akceptowalnym kompromisem między wartością bardzo precyzyjnej arytmetyki a ceną wdrożenia jej w celu szybkiego działania; więcej bajtów precyzji stanie się tolerowane, a ostatecznie format 16-bajtowy… Ten rodzaj stopniowej ewolucji w kierunku większej precyzji był już widoczny, gdy opracowano ramkę IEEE Standard 754 dla arytmetyki zmiennoprzecinkowej ”.

W IEEE 754-2008 128-bitowy format base-2 jest oficjalnie określany jako binary128 .

Format binarny zmiennoprzecinkowy o poczwórnej precyzji IEEE 754: binarny128

Standard IEEE 754 określa binarny128 jako posiadający:

Daje to dokładność od 33 do 36 znaczących cyfr dziesiętnych. Jeśli ciąg dziesiętny z maksymalnie 33 cyframi znaczącymi jest konwertowany na reprezentację o poczwórnej precyzji IEEE 754, a następnie konwertowany z powrotem na ciąg dziesiętny o tej samej liczbie cyfr, wynik końcowy powinien być zgodny z oryginalnym ciągiem. Jeśli liczba o poczwórnej precyzji IEEE 754 zostanie przekonwertowana na ciąg dziesiętny z co najmniej 36 cyframi znaczącymi, a następnie przekonwertowana z powrotem na reprezentację o poczwórnej precyzji, wynik końcowy musi być zgodny z oryginalną liczbą.

Format jest zapisywany z niejawnym bitem wiodącym o wartości 1, chyba że wykładnik jest przechowywany ze wszystkimi zerami. Tak więc w formacie pamięci pojawia się tylko 112 bitów znaczącego , ale całkowita precyzja wynosi 113 bitów (około 34 cyfry dziesiętne: log 10 (2 113 ) ≈ 34.016 ). Bity są ułożone jako:

Bit znaku, 15-bitowy wykładnik i 112-bitowy significand

Binary256 będzie mieć dokładność mantysy 237 bitów (około 71 miejsc po przecinku) i wykładnik polaryzacji 262143.

Kodowanie wykładników

Binarny wykładnik zmiennoprzecinkowy o poczwórnej precyzji jest kodowany przy użyciu reprezentacji binarnej z przesunięciem , przy czym przesunięcie zerowe wynosi 16383; jest to również znane jako wykładnik odchylenia w standardzie IEEE 754.

  • E min = 0001 16 − 3FFF 16 = −16382
  • E max = 7FFE 16 − 3FFF 16 = 16383
  • Błąd wykładnika = 3FFF 16 = 16383

Tak więc, zgodnie z definicją przez binarną reprezentację przesunięcia, aby uzyskać prawdziwy wykładnik, przesunięcie 16383 musi zostać odjęte od zapisanego wykładnika.

Zapisane wykładniki 0000 16 i 7FFF 16 są interpretowane specjalnie.

Wykładnik potęgowy Znaczące i zero Znaczące i niezerowe Równanie
0000 16 0 , −0 liczby podnormalne (-1) bit znaku × 2 -16382 × 0.significandbits 2
0001 16 , ..., 7FFE 16 znormalizowana wartość (1) signbit x 2 exponentbits 2 - 16383 x 1.significandbits 2
7FFF 16 ± NaN (cichy, sygnalizacja)

Minimalna ściśle dodatnia (subnormalna) wartość wynosi 2 −16494 ≈ 10 −4965 i ma precyzję tylko do jednego bitu. Minimalna dodatnia wartość normalna wynosi 2 -163823,3621 × 10 -4932 i ma precyzję 113 bitów, czyli również ±2 -16494 . Maksymalna reprezentowana wartość to 2 16384 − 2 162711,1897 × 10 4932 .

Przykłady poczwórnej precyzji

Te przykłady są podane w reprezentacji bitowej , w systemie szesnastkowym , wartości zmiennoprzecinkowej. Obejmuje to znak, (tendencyjny) wykładnik i znaczenie.

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

Domyślnie 1/3 zaokrągla się w dół jak podwójna precyzja , ze względu na nieparzystą liczbę bitów w znaczącej. Tak więc bity poza punktem zaokrąglenia 0101...to mniej niż 1/2 jednostki na ostatnim miejscu .

Podwójna podwójna arytmetyka

Powszechna technika oprogramowania do implementacji prawie poczwórnej precyzji przy użyciu par wartości podwójnej precyzji jest czasami nazywana podwójną arytmetyką . Używając par wartości podwójnej precyzji IEEE z 53-bitowymi znaczącymi, podwójna arytmetyka zapewnia operacje na liczbach ze znaczącymi co najmniej 2 × 53 = 106 bitów (w rzeczywistości 107 bitów z wyjątkiem niektórych największych wartości, ze względu na ograniczony wykładnik zakres), tylko nieco mniej precyzyjny niż 113-bitowy significand z poczwórną precyzją IEEE binary128. Zakres podwójnej precyzji pozostaje zasadniczo taki sam jak w przypadku formatu podwójnej precyzji, ponieważ wykładnik ma nadal 11 bitów, znacznie mniej niż 15-bitowy wykładnik poczwórnej precyzji IEEE (zakres 1,8 × 10 308 dla podwójnej precyzji w porównaniu z 1,2 × 10 4932 dla binarnego128).

W szczególności, wartość q podwójnej/poczwórnej precyzji w technice podwójnej podwójnej jest reprezentowana niejawnie jako suma q = x + y dwóch wartości podwójnej precyzji x i y , z których każda dostarcza połowę wartości znaczącej q . Oznacza to, że para ( x , y ) jest przechowywana w miejscu q , a operacje na wartościach q (+, −, ×, ...) są przekształcane w równoważne (ale bardziej skomplikowane) operacje na wartościach x i y . Zatem arytmetyka w tej technice sprowadza się do sekwencji operacji podwójnej precyzji; ponieważ arytmetyka o podwójnej precyzji jest powszechnie implementowana w sprzęcie, arytmetyka o podwójnej precyzji jest zwykle znacznie szybsza niż bardziej ogólne techniki arytmetyczne o dowolnej precyzji .

Zauważ, że arytmetyka podwójnego podwójnego ma następujące cechy szczególne:

  • Wraz ze spadkiem wielkości wartości zmniejsza się również ilość dodatkowej precyzji. Dlatego najmniejsza liczba w znormalizowanym zakresie jest węższa niż podwójna precyzja. Najmniejsza liczba z pełną precyzją to 1000...0 2 (106 zer) × 2 -1074 lub 1,000...0 2 (106 zer) × 2 -968 . Liczby, których wielkość jest mniejsza niż 2-1021 , nie będą miały dodatkowej precyzji w porównaniu z podwójną precyzją.
  • Rzeczywista liczba bitów precyzji może się różnić. Ogólnie rzecz biorąc, wielkość części niższego rzędu liczby jest nie większa niż połowa ULP części wyższego rzędu. Jeśli część niższego rzędu jest mniejsza niż połowa ULP części wyższego rzędu, znaczące bity (albo wszystkie zera lub wszystkie jedynki) są dorozumiane między znaczącymi liczbami wyższego rzędu i niższego rzędu. Niektóre algorytmy, które opierają się na stałej liczbie bitów w liczbie znaczącej, mogą się nie powieść przy użyciu 128-bitowych liczb podwójnych.
  • Z powyższego powodu możliwe jest reprezentowanie wartości takich jak 1 + 2 −1074 , która jest najmniejszą możliwą do przedstawienia liczbą większą niż 1.

Oprócz arytmetyki podwójnej podwójnej możliwe jest również generowanie arytmetyki potrójnej podwójnej lub poczwórnej podwójnej, jeśli wymagana jest wyższa precyzja bez żadnej biblioteki zmiennoprzecinkowej o wyższej precyzji. Są one reprezentowane jako suma odpowiednio trzech (lub czterech) wartości podwójnej precyzji. Mogą reprezentować operacje z odpowiednio co najmniej 159/161 i 212/215 bitami.

Podobną technikę można zastosować do utworzenia arytmetyki podwójnej czwórki , która jest reprezentowana jako suma dwóch wartości o poczwórnej precyzji. Mogą reprezentować operacje z co najmniej 226 (lub 227) bitami.

Realizacje

Poczwórna precyzja jest często implementowana w oprogramowaniu za pomocą różnych technik (takich jak powyższa technika podwójnej podwójnej precyzji, chociaż ta technika nie implementuje poczwórnej precyzji IEEE), ponieważ bezpośrednie wsparcie sprzętowe dla poczwórnej precyzji jest, od 2016 r., mniej powszechne (patrz „Obsługa sprzętu ” poniżej). Można użyć ogólnych bibliotek arytmetycznych o dowolnej precyzji, aby uzyskać poczwórną (lub wyższą) precyzję, ale wyspecjalizowane implementacje o poczwórnej precyzji mogą osiągnąć wyższą wydajność.

Obsługa języka komputerowego

Osobną kwestią jest zakres, w jakim typy o poczwórnej precyzji są bezpośrednio włączane do języków programowania komputerów .

Poczwórna precyzja jest określona w Fortran przez real(real128)( iso_fortran_envnależy użyć modułu z Fortran 2008, stała real128wynosi 16 na większości procesorów) lub jako real(selected_real_kind(33, 4931)), lub w niestandardowy sposób jako REAL*16. (Poczwórna precyzja REAL*16jest obsługiwana przez kompilator Intel Fortran i kompilator GNU Fortran na przykład na architekturach x86 , x86-64 i Itanium ).

W przypadku języka programowania C norma ISO/IEC TS 18661-3 (rozszerzenia zmiennoprzecinkowe dla C, typy wymiany i rozszerzone) określa _Float128jako typ implementujący format poczwórnej precyzji IEEE 754 (binary128). Alternatywnie, w C / C++ z kilkoma systemami i kompilatorami poczwórna precyzja może być określona przez typ long double , ale nie jest to wymagane przez język (który wymaga jedynie, long doubleaby była co najmniej tak precyzyjna jak double), ani nie jest to powszechne.

Na x86 i x86-64 najpopularniejsze kompilatory C/C++ implementują long doublealbo jako 80-bitową rozszerzoną precyzję (np. GNU C Compiler gcc i kompilator Intel C++ z /Qlong‑doubleprzełącznikiem) albo po prostu jako synonim podwójnej precyzji (np. Microsoft Visual C++ ), a nie jako poczwórna precyzja. Standard wywoływania procedur dla 64-bitowej architektury ARM (AArch64) określa, że long doubleodpowiada formatowi poczwórnej precyzji IEEE 754. Na kilku innych architekturach niektóre kompilatory C/C++ implementują z long doublepoczwórną precyzją, np. gcc na PowerPC (jako double-double) i SPARC lub kompilatory Sun Studio na SPARC. long doubleJednak nawet jeśli nie jest to poczwórna precyzja, niektóre kompilatory C/C++ udostępniają niestandardowy typ o poczwórnej precyzji jako rozszerzenie. Na przykład, gcc zapewnia typ o poczwórnej precyzji, wywoływany __float128dla procesorów x86, x86-64 i Itanium , a na PowerPC jako 128-bitowy zmiennoprzecinkowy IEEE przy użyciu opcji -mfloat128-hardware lub -mfloat128; a niektóre wersje kompilatora Intela C/C++ dla x86 i x86-64 dostarczają niestandardowy typ o poczwórnej precyzji o nazwie _Quad.

Biblioteki i skrzynki narzędziowe

  • GCC quad precyzji biblioteka matematyczna, libquadmath , zapewnia __float128i __complex128operacje.
  • Biblioteka Boost multiprecision Boost.Multiprecision zapewnia ujednolicony międzyplatformowy interfejs C++ dla __float128i _Quadtypów oraz zawiera niestandardową implementację standardowej biblioteki matematycznej.
  • Multiprecision Computing Toolbox for MATLAB umożliwia obliczenia o poczwórnej precyzji w MATLAB . Obejmuje podstawowe funkcje arytmetyczne, a także metody numeryczne, gęstą i rzadką algebrę liniową.
  • Pakiet DoubleFloats zapewnia obsługę obliczeń podwójnego podwójnego dla języka programowania Julia.
  • Biblioteka doubledouble.py umożliwia obliczenia typu double-double w Pythonie.
  • Mathematica obsługuje liczby o poczwórnej precyzji IEEE: 128-bitowe wartości zmiennoprzecinkowe (Real128) i 256-bitowe wartości złożone (Complex256).

Wsparcie sprzętowe

Poczwórna precyzja IEEE została dodana do IBM S/390 G5 w 1998 roku i jest obsługiwana sprzętowo w kolejnych procesorach z/Architecture . Procesor IBM POWER9 ( Power ISA 3.0 ) ma natywną obsługę 128-bitowego sprzętu.

Natywna obsługa IEEE 128-bit floats jest zdefiniowana w PA-RISC 1.0 oraz w architekturach SPARC V8 i V9 (np. istnieje 16 rejestrów o poczwórnej precyzji %q0, %q4, ...), ale żaden procesor SPARC nie implementuje poczwórnej precyzyjne operacje w sprzęcie od 2004 r.

Nie-IEEE o rozszerzonej precyzji (128 bitów pamięci, 1 bit znaku, 7 bitów wykładnika, 112 bitów ułamka, 8 bitów nieużywanych) został dodany do serii IBM System/370 (1970-1980) i był dostępny w niektórych S/360 modele z lat 60. (S/360-85, -195 i inne na specjalne zamówienie lub symulowane przez oprogramowanie OS).

VAX procesor realizowane non-IEEE poczwórnej precyzji punkt jako jego „H” zmiennoprzecinkowych formacie pływającego. Miał jeden bit znaku, 15-bitowy wykładnik i 112-bitowy ułamek, jednak układ w pamięci znacznie różnił się od poczwórnej precyzji IEEE, a także różnił się wykładnikiem. Tylko kilka najwcześniejszych procesorów VAX implementowało sprzętowe instrukcje zmiennoprzecinkowe H, wszystkie inne emulowały zmiennoprzecinkowe H w oprogramowaniu.

Architektura RISC-V określa rozszerzenie „Q” (quad-precision) dla 128-bitowej binarnej arytmetyki zmiennoprzecinkowej IEEE 754-2008. Rozszerzenie „L” (jeszcze nie certyfikowane) określa 64-bitową i 128-bitową liczbę zmiennoprzecinkową dziesiętną.

Implementacji sprzętowej o poczwórnej precyzji (128-bitowej) nie należy mylić z „128-bitowymi jednostkami FPU”, które implementują instrukcje SIMD , takie jak Streaming SIMD Extensions lub AltiVec , które odnoszą się do 128-bitowych wektorów czterech 32-bitowych dwie 64-bitowe wartości podwójnej precyzji, które są obsługiwane jednocześnie.

Zobacz też

Bibliografia

Zewnętrzne linki