Formatul în virgulă mobilă cu precizie dublă, abreviat FP64, float64 sau double este un format de reprezentare în memoria calculatoarelor a numerelor reale. Reprezentarea ocupă 64 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 simplă, motiv pentru care formatul cu precizie dublă poate fi ales atunci când intervalul sau precizia formatului cu precizie simplă ar fi insuficiente.

În standardul IEEE 754, formatul cu baza 2 pe 64 de biți este denumit binary64; a fost numit double în IEEE 754-1985. IEEE 754 specifică formate suplimentare în virgulă mobilă, inclusiv reprezentări cu virgulă mobilă pe 32 de biți, cu precizie simplă și, mai recent, reprezentări în baza 10 (virgulă mobilă zecimală).

Unul dintre primele limbaje de programare care au oferit tipuri de date în virgulă mobilă a fost Fortran. Înainte de adoptarea pe scară largă a standardului IEEE 754-1985, reprezentarea și proprietățile tipurilor de date în virgulă mobilă depindeau de producătorul și de modelul computerului, precum și de deciziile luate de implementatorii limbajelor de programare. De exemplu, tipul de date cu precizie dublă al GW-BASIC era formatul în virgulă mobilă .

În Fortran precizia dublă este descrisă REAL(8) sau REAL*8.

Standardul IEEE 754: binary64 Standardul IEEE 754 descrie binary64 ca având: 1 , 11 biți exponent, 53 biți (din care stocați efectiv 52) 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 11 biți de la 0 la 2047, în forma exponent deplasat cu exces 1023: valoarea 1023 corespunde exponentului 0. Exponenții variază de la −1022 la +1023 (deci de la 1 la 2046 î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 53 de biți de mantisă, 52 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 52 de biți de fracție ai semnificandului apar în formatul de memorie, dar precizia totală este de 53 de 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 15 la 17 cifre zecimale semnificative. Dacă un șir zecimal cu cel mult 15 cifre semnificative este convertit în formatul IEEE 754 cu precizie dublă, 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 dublă este convertit într-un șir zecimal cu cel puțin 17 cifre semnificative și apoi convertit înapoi la reprezentare cu precizie dublă, rezultatul final trebuie să corespundă cu numărul original. Biții sunt poziționați în modul următor:

Fișier:IEEE 754 Double Floating Point Format.svg

Valoarea reală a unei date binary64 pe 64 de biți cu un semn dat, un exponent deplasat E (întreg fără semn pe 11 biți) și o parte fracționară pe 53 de biți este:

sau

Numerele cuprinse între și sunt reprezentate exact. Pentru intervalul următor, de la 253 la 254, ele sunt înmulțite cu 2, adică rotunjite la un număr par etc. Invers, pentru intervalul precedent, de la la 252, intervalul de spațiere (eroare) este 0,5 etc.

Spațierea numerelor fracționare din intervalul de la la este Prin urmare, eroarea maximă de rotunjire prin rotunjirea la cel mai apropiat număr reprezentabil (epsilonul mașinii) este de

Cei 11 biți ai exponentului permit reprezentarea numerelor între și cu o precizie completă de 15–17 cifre zecimale. Printr-un oarecare compromis asupra preciziei, reprezentarea numerelor nenormalizate permite valori chiar mai mici, de până la aproximativ

Valori particulare în reprezentarea binary64 Exemplele sunt în reprezentare binară, hexazecimală și zecimală. Binar Hexa Calcul Valoare Observații 2−1022 × 2−52 = 2−1074 Cel mai mic număr pozitiv nenormalizat 0 00000000000 1111...1111 000f ffff ffff ffff 2−1022 × (1 − 2−52) ≈2,2250738585072009×10−308 Cel mai mare număr pozitiv nenormalizat 0 00000000001 0000...0000 0010 0000 0000 0000 2−1022 ≈2,2250738585072014×10−308 Cel mai mic număr pozitiv normalizat 0 11111111110 1111...1111 7fef ffff ffff ffff 21023 × (2 − 2−52) ≈1,7976931348623157×10308 Cel mai mare număr normalizat 0 01111111111 0000...0000 3ff0 0000 0000 0000 +20 × 1 1 (unu) 0 01111111111 0000...0001 3ff0 0000 0000 0001 +20 × (1 + 2−52) ≈1,0000000000000002220 Cel mai mic număr supraunitar 1 10000000000 0000...0000 c000 0000 0000 0000 −21 × 1 −2 0 10000000000 0000...0000 4000 0000 0000 0000 +21 × 1 2 1 00000000000 0000...0000 8000 0000 0000 0000 −0 0 00000000000 0000...0000 0000 0000 0000 0000 0 1 11111111111 0000...0000 fff0 0000 0000 0000 −infinit 0 11111111111 0000...0000 7ff0 0000 0000 0000 infinit 0 01111111101 0101...0101 3fd5 5555 5555 5555 ≈0,33333333333333331483 1/3 0 10000000000 1001...1000 4009 21fb 5444 2d18 ≈3,141592653589793116 π (pi) 0 11111111111 1000...0001 7ff8 0000 0000 0001 qNaN (procesoare x86, ARM) 0 11111111111 0000...0001 7ff0 0000 0000 0001 sNaN (procesoare x86, ARM) 0 11111111111 1111...1111 7fff ffff ffff ffff NaN (altă posibilă codificare)

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.

Codificările qNaN și sNaN nu sunt specificate în IEEE 754 și sunt implementate diferit pe procesoare diferite. Familia de procesoare x86 și familia de procesoare ARM utilizează bitul cel mai semnificativ al semnificandului pentru a indica un NaN silențios (qNaN). Procesoarele utilizează bitul pentru a indica un NaN de semnalizare (sNaN).

Viteză de execuție în aritmetica cu precizie dublă Utilizarea variabilelor în virgulă mobilă cu precizie dublă este mai lentă decât lucrul cu variantele lor cu precizie simplă. Un domeniu al calculului în care aceasta este o problemă deosebită este codul paralel care rulează pe GPU-uri. De exemplu, atunci când se utilizează platforma CUDA de la Nvidia, calculele cu precizie dublă pot dura, în funcție de hardware, de 2 până la 32 de ori mai mult timp în comparație cu cele efectuate folosind precizia simplă.

În plus, multe funcții matematice (de exemplu, sin, cos, atan2, log, exp și sqrt) necesită mai multe calcule pentru a oferi rezultate cu precizie dublă, prin urmare sunt mai lente.

Limite ale preciziei la numere întregi În tabel sunt prezentate intervalele de precizie la reprezentarea numerelor întregi. Pentru numerele negative precizia este aceeași ca la numerele pozitive. De la Până la Interval de precizie −253 = −9.007.199.254.740.992 253 = 9.007.199.254.740.992 reprezentabile exact 253 254 = 18.014.398.509.481.984 rotunjite la multiplu de 2 254 255 = 36.028.797.018.963.968 rotunjite la multiplu de 4 2n 2n+1 rotunjite la multiplu de 2n−52 21024 peste rotunjite la „infinit”

Implementări Precizia dublă este implementată în multe limbaje de programare în moduri diferite. Pe procesoarele cu precizie dinamică, cum ar fi x86 fără SSE2 (sau când SSE2 nu este utilizat, din motive de compatibilitate) și cu precizie extinsă utilizată implicit, software-ul poate întâmpina dificultăți în îndeplinirea anumitor cerințe.

C și C++ C și C++ oferă o mare varietate de . Standardele nu impun precizia dublă (cu excepția anexei opționale F a C99, care acoperă aritmetica IEEE 754), dar pe majoritatea sistemelor, tipul double corespunde unei precizii duble. Totuși, pe x86 pe 32 de biți cu precizie extinsă implicită, este posibil ca unele compilatoare să nu se conformeze standardului C sau aritmetica poate suferi în urma rotunjirii duble (pe parcurs și finală).

Fortran Fortran oferă mai multe tipuri de date întregi și reale, iar tipul real64 pe 64 de biți, accesibil prin modulul intrinsec iso_fortran_env al Fortran, corespunde preciziei duble.

Common Lisp Common Lisp oferă tipurile SHORT-FLOAT, SINGLE-FLOAT, DOUBLE-FLOAT și LONG-FLOAT. Majoritatea implementărilor oferă tipuri SINGLE-FLOAT și DOUBLE-FLOAT cu sinonimele corespunzătoare pentru celelalte tipuri. Common Lisp oferă excepții pentru detectarea depășirilor superioară și inferioară și a excepțiilor în virgulă mobilă conform IEEE 754. Nu sunt descrise infinituri și NaN-uri în standardul ANSI, însă mai multe implementări le oferă ca extensii.

Java În Java înainte de versiunea 1.2, fiecare implementare trebuia să fie conformă cu IEEE 754. Versiunea 1.2 a permis implementărilor să aducă o precizie suplimentară în calculele intermediare pentru platforme precum . Astfel, a fost introdus un modificator strictfp pentru a impune calcule strict coform IEEE 754. Virgula mobilă strictă a fost restabilită în Java 17.

JavaScript Conform specificațiilor standardului ECMAScript, toate operațiunile aritmetice din JavaScript trebuie efectuate utilizând aritmetică în virgulă mobilă cu precizie dublă.

JSON Formatul de date JSON acceptă valori numerice și nu impune limite privind precizia sau intervalul acestora. Totuși, deoarece numerele binary64 IEEE 754 sunt implementate pe scară largă, IRFC 8259 recomandă ca implementările de procesare JSON pot oferi o bună interoperabilitate dacă nu se așteaptă la o precizie sau un interval mai mare decât cele oferite de binary64. T. Bray (December 2017). The JavaScript Object Notation (JSON) Data Interchange Format. Internet Engineering Task Force. doi:10.17487/RFC8259. . STD 90. RFC 8259. Internet Standard 90.

Rust și Zig Rust și Zig au tipul de date f64.

Note

Vezi și Formatul în virgulă mobilă cu semiprecizie Formatul în virgulă mobilă cu precizie simplă Formatul în virgulă mobilă cu precizie cvadruplă Precizie extinsă

Legături externe

C source code to convert between IEEE double, single, and half precision

Categorie:Aritmetica calculatoarelor Categorie:Tipuri de date