Formatul în virgulă mobilă cu precizie cvadruplă sau quad este un format de reprezentare în memoria calculatoarelor a numerelor reale. Reprezentarea ocupă 128 de biți și poate reprezenta în sistemul virgulă mobilă o gamă mai largă de numere și cu o precizie mai mare decât la reprezentarea în formatul cu precizie dublă, motiv pentru care formatul cu precizie cvadruplă poate fi ales atunci când intervalul sau precizia formatului cu precizie dublă ar fi insuficiente, iar principala sa funcție este de a permite calcularea rezultatelor cu precizie dublă într-un mod mai fiabil și mai precis, prin minimizarea depășirii și a erorilor de rotunjire în calculele intermediare și variabilele inițiale. William Kahan, arhitectul principal al standardului IEEE 754 original pentru virgulă mobilă, a remarcat: „Pentru moment, formatul extins pe 10 octeți este un compromis tolerabil între aritmetica extraprecisă și prețul implementării acesteia pentru a rula rapid; foarte curând, încă doi octeți de precizie vor deveni tolerabili și, în cele din urmă, un format de 16 octeți... Acest tip de evoluție treptată către o precizie mai mare era deja în vedere când a fost elaborat standardul IEEE 754 pentru aritmetica în virgulă mobilă.”

În standardul IEEE 754-2008, formatul cu baza 2 pe 128 de biți este denumit binary128.

Standardul IEEE 754: binary128 Standardul IEEE 754 descrie binary128 ca având: 1 , 15 biți exponent, 113 biți (din care stocați efectiv 112) de semnificand.

Bitul de semn determină semnul numărului, care este și semnul semnificandului. „1” reprezintă semnul negativ. Câmpul exponentului este un număr întreg fără semn pe 15 biți de la 0 la 32767, în forma exponent deplasat cu exces 16383: valoarea 16383 corespunde exponentului 0. Exponenții variază de la −16382 la +16383 (deci de la 1 la 32767 în câmpul exponentului), deoarece valorile exponenților cu toate cifrele 0 sau 1 sunt rezervate pentru numere speciale (numere nenormalizate, zerouri cu semn, infinit pozitiv și negativ și ).

Semnificandul complet al numerelor normale are 113 biți de mantisă, 112 la dreapta virgulei binare și un cel mai semnificativ bit (la stânga virgulei binare), cu valoarea 1, nereprezentat („implicit”). Numerele nenormalizate și zerourile (care sunt numerele în virgulă mobilă mai mici ca mărime decât cel mai mic număr pozitiv normalizat) sunt reprezentate cu valoarea exponentului deplasat 0, dând primului bit semnificativ implicit valoarea 0. Astfel, doar 112 biți de fracție ai semnificandului apar în formatul de memorie, dar precizia totală este de 113 biți (echivalent cu cifre zecimale) pentru valorile normalizate; valorile nenormalizate au o precizie care se degradează ușor până la 1 bit pentru cea mai mică valoare diferită de zero.

Aceasta oferă o precizie de la 33 la 36 cifre zecimale semnificative. Dacă un șir zecimal cu cel mult 33 de cifre semnificative este convertit în formatul IEEE 754 cu precizie cvadruplă, rezultând un număr normalizat, care apoi convertit înapoi într-un șir zecimal cu același număr de cifre, rezultatul final ar trebui să corespundă cu șirul original. Dacă un număr în formatul IEEE 754 cu precizie cvadruplă este convertit într-un șir zecimal cu cel puțin 36 de cifre semnificative și apoi convertit înapoi la reprezentare cu precizie cvadruplă, rezultatul final trebuie să corespundă cu numărul original. Biții sunt poziționați în modul următor:

800px

Valori particulare în reprezentarea binary128 Exemplele sunt în reprezentare hexazecimală și zecimală. Hexa   Calcul    Valoare Observații 2−16382 × 2−112 = 2−16494 Cel mai mic număr pozitiv nenormalizat 0000 ffff ffff ffff ffff ffff ffff ffff 2−16382 × (1 − 2−112) ≈3,3621031431120935062626778173217519551×10−4932 Cel mai mare număr pozitiv nenormalizat 0001 0000 0000 0000 0000 0000 0000 0000 2−16382 ≈3,3621031431120935062626778173217526026×10−4932 Cel mai mic număr pozitiv normalizat 7ffe ffff ffff ffff ffff ffff ffff ffff 216383 × (2 − 2−112) ≈1,1897314953572317650857593266280070162×104932 Cel mai mare număr normalizat 3ffe ffff ffff ffff ffff ffff ffff ffff 1 − 2−113 ≈0,9999999999999999999999999999999999037 Cel mai mare număr subunitar 3fff 0000 0000 0000 0000 0000 0000 0000 1 (unu) 3fff 0000 0000 0000 0000 0000 0000 0001 1 + 2<sup>−112 ≈1,0000000000000000000000000000000001926 Cel mai mic număr supraunitar c000 0000 0000 0000 0000 0000 0000 0000 −2 4000 0000 0000 0000 0000 0000 0000 0000 2 8000 0000 0000 0000 0000 0000 0000 0000 −0 0000 0000 0000 00000000 0000 0000 0000 0 ffff 0000 0000 0000 0000 0000 0000 0000 −infinit 7fff 0000 0000 0000 0000 0000 0000 0000 infinit 3ffd 5555 5555 5555 5555 5555 5555 5555 ≈3333333333333333333333333333333333173 1/3 4000 921f b544 42d1 8469 898c c517 01b8 ≈3,1415926535897932384626433832795027975 π (pi)

Implicit, 1/3 este rotunjit în jos, în loc de în sus, ca în precizie simplă, datorită numărului impar de biți din semnificant. Biții de 1/3 dincolo de punctul de rotunjire sunt 0101..., care este mai puțin decât 1/2 din unitatea de pe ultimul loc.

Aritmetica dublu-dublă O tehnică software comună pentru implementarea unei precizii aproape cvadruple folosind perechi de valori reprezentate cu precizie dublă este uneori numită aritmetică dublu-dublă. Yozo Hida, X. Li, and D. H. Bailey, Quad-Double Arithmetic: Algorithms, Implementation, and Application, Lawrence Berkeley National Laboratory Technical Report LBNL-46996 (2000). Also Y. Hida et al., Library for double-double and quad-double arithmetic (2007). J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates, Discrete & Computational Geometry 18: 305–363, 1997. Folosind perechi de valori IEEE cu precizie dublă cu semnificand pe 53 de biți, aritmetica dublu-dublă oferă operații asupra numerelor cu semnificand de cel puțin (în realitate 107 biți Robert Munafo. F107 and F161 High-Precision Floating-Point Data Types (2011) cu excepția unora dintre cele mai mari valori, datorită intervalului limitat de exponenți), doar puțin mai puțin precis decât semnificandul de 113 biți al preciziei cvadruple IEEE binary128. Intervalul unui format dublu-dublu rămâne în esență același ca în formatul cu precizie dublă, deoarece exponentul are tot 11 biți, semnificativ mai mic decât exponentul pe 15 biți al preciziei cvadruple IEEE (gama de pentru dublu-dublu față de pentru binary128).

În particular, o valoare cu precizie dublu-dublă este reprezentată în tehnica dublu-dublă ca o sumă a două valori cu precizie dublă și , fiecare dintre acestea furnizând jumătate din semnificandul lui . Adică, perechea este stocată în locul lui , iar operațiunile asupra valorilor sunt transformate în operații echivalente (dar mai complicate) asupra valorilor . Astfel, aritmetica în această tehnică se reduce la o secvență de operații în precizie dublă. Deoarece aritmetica cu precizie dublă este implementată în mod obișnuit în hardware, aritmetica dublu-dublă este de obicei substanțial mai rapidă decât tehnicile mai generale de .

De reținut că aritmetica dublu-dublă are următoarele caracteristici particulare: 128-Bit Long Double Floating-Point Data Type.

Pe măsură ce mărimea valorii scade, scade și gradul de precizie suplimentară. Prin urmare, cel mai mic număr din intervalul normalizat este mai restrâns decât în precizia dublă. Cel mai mic număr cu precizie maximă este sau . Numerele a căror mărime este mai mică decât 2−1021 nu vor avea o precizie suplimentară în comparație cu precizia dublă.

Numărul real de biți de precizie poate varia. În general, mărimea părții de ordin inferior a numărului nu este mai mare decât jumătate din unitatea din ultima poziție din partea de ordin superior. Dacă partea de ordin inferior este mai mică decât jumătate din unitatea din ultima poziție din partea de ordin superior, biții semnificativi (fie toți 0, fie toți 1) sunt implicați între semnificandul numerelor de ordin superior și cel de ordin inferior. Anumiți algoritmi care se bazează pe un număr fix de biți în semnificand pot eșua atunci când utilizează numere duble de 128 de biți.

Din motivul de mai sus, este posibil să se reprezinte valori precum care este cel mai mic număr reprezentabil mai mare decât 1.

Pe lângă aritmetica dublu-dublă, este posibilă și generarea de aritmetică triplu-dublă sau cvadruplu-dublă dacă este necesară o precizie mai mare, fără a fi necesară o bibliotecă de virgulă mobilă cu precizie mai mare. Acestea sunt reprezentate ca o sumă de trei (respectiv patru) valori cu precizie dublă. Pot reprezenta operații cu cel puțin 159/161, respectiv 212/215 biți.

O tehnică similară poate fi utilizată pentru a produce o aritmetică dublu-cvadruplă, care este reprezentată ca o sumă a două valori cu precizie cuadruplă. Acestea pot reprezenta operații cu cel puțin 226 (respectiv 227) de biți. sourceware.org Re: The state of glibc libm

Implementări Precizia cvadruplă este adesea implementată în software printr-o varietate de tehnici (cum ar fi tehnica dublu-dublă de mai sus, deși această tehnică nu implementează precizia cvadruplă IEEE), deoarece suportul hardware direct pentru precizia cvadruplă era în 2016 mai puțin comun. Se pot utiliza biblioteci generale de aritmetică cu precizie multiplă pentru a obține o precizie cvadruplă (sau mai mare), dar implementările specializate de precizie cvadruplă pot obține performanțe mai bune.

Suportul în limbajele de programare O întrebare separată este măsura în care tipurile cu precizie cvadruplă sunt încorporate direct în limbajele de programare ale computerelor.

În Fortran precizia cvadruplă este specificată prin real(real128) (trebuie folosit modulul iso_fortran_env din Fortran 2008, constantele real128 sunt reprezentate pe 16 octeți pe majoritatea procesoarelor), sau prin real(selected_real_kind(33, 4931)), sau în mod nestandard prin REAL*16. (Precizia cvadruplă REAL*16 are suport de exemplu în și în compilatorul în arhitecturi x86, x86-64 și .)

În C ISO/IEC TS 18661-3 (extinderi în virgulă mobilă pentru C, tipuri de interschimb și tipuri extinse) specifică _Float128 ca tipul care implementează formatul IEEE 754 cu precizie cvadruplă (binary128). Alternativ, în C/C++, în câteva sisteme și compilatoare precizia cvadruplă poate fi specificată prin tipul , dar acest lucru nu este cerut de limbaj (care necesită doar ca long double să fie cel puțin la fel de precis ca double), și nici nu este un lucru obișnuit.

În cu <stdfloat> se poate defini un antet care conține tipurile de virgulă mobilă cu lungimi fixe. Implementările sunt opționale, dar, dacă există, std::float128_t corespunde la precizia cvadruplă.