În informatică precizia extinsă se referă la formatele din aritmetica în virgulă mobilă care oferă o precizie mai mare decât formatele în virgulă mobilă clasice. definește formatele cu precizie extinsă drept "Un format care extinde un format de bază acceptat oferind o precizie mai bună și o gamă de valori mai largă." Formatele cu precizie extinsă ajută un format de bază prin minimizarea erorilor de rotunjire și depășire în valorile intermediare ale expresiilor aflate în formatul de bază. Spre deosebire de precizia extinsă, se referă la implementări de tipuri numerice mult mai mari (inclusiv pe lungimi de zone de memorie care nu sunt puteri ale lui doi) folosind software specializat (sau, rareori, hardware).
Implementări ale preciziei extinse Există o lungă istorie a formatelor extinse în virgulă mobilă, care datează aproape din mijlocul secolului al XX-lea. Diverși producători au folosit pentru diferite mașini diverse formate pentru precizia extinsă. În multe cazuri, formatul preciziei extinse nu este chiar același cu o scalare a formatelor obișnuite cu precizie simplă și dublă pe care este menit să le extindă. În câteva cazuri, implementarea a fost doar o modificare bazată pe software a formatului de date în virgulă mobilă, dar în majoritatea cazurilor precizia extinsă a fost fie implementată în hardware, fie încorporată în procesorul central, fie, mai des, încorporată în hardware-ul unui procesor opțional, atașat, numit „” (în – FPU).
Formatele IBM cu precizie extinsă din 1965 a oferit două formate în virgulă mobilă: un format cu „precizie standard” pe 32 de biți și un format cu „precizie extinsă” pe 40 de biți. Formatul cu precizie standard avea un semnificand în complement față de doi pe 24 de biți, în timp ce formatul cu precizie extinsă utiliza un semnificand în complement față de doi pe 32 de biți. Ultimul format utiliza la maximum operațiile cu numere întregi pe 32 de biți ale procesorului. Caracteristica ambelor formate era un câmp pe 8 biți care conținea un exponent deplasat în baza 2 cu exces 128. Operațiile aritmetice în virgulă mobilă erau efectuate de software, iar operațiile cu precizie dublă nu aveau deloc suport. Formatul extins ocupă trei cuvinte pe 16 biți, spațiul suplimentar de 8 biți fiind neutilizat.
accepta un format în virgulă mobilă „scurt” pe 32 de biți și un format în virgulă mobilă „lung” pe 64 de biți. Versiunile 360/85 și următoarele, , asigurau suport pentru un format „extins” pe 128 de biți. Aceste formate sunt încă acceptate în designul actual al , unde acum sunt numite „virgulă mobilă hexazecimală" (în – HFP).
Formatul MBF cu precizie extinsă al Microsoft Versiunea pentru procesorul , cum ar fi în adaptări precum , , KIM-1 BASIC sau MicroTAN BASIC, accepta o variantă extinsă pe 40 de biți a formatului în virgulă mobilă (MBF) din 1977.
Formatele IEEE 754 cu precizie extinsă Standardul IEEE 754 pentru virgulă mobilă recomandă ca implementările să furnizeze formate cu precizie extinsă. Standardul specifică cerințele minime pentru un format extins, dar nu specifică o codificare. Codificarea este la alegerea celui ce le implementează.
Procesoarele , x86-64 și asigură suport celui mai influent format din acest standard, formatul „dublu extins” Intel pe 80 de biți (cu semnificandul pe 64 de biți), descris în secțiunea următoare.
Coprocesorul matematic și procesoarele și acceptă, de asemenea, un format de precizie extinsă cu semnificandul pe 64 de biți (similar cu formatul Intel, deși completat la 96 de biți cu 16 biți neutilizați inserați între câmpurile exponent și semnificand, iar valorile cu exponentul zero și 1 în bitul 63 sunt valori normalizate. ) Procesoarele ulterioare nu acceptă acest format cu precizie extinsă pe 96 de biți.
Coprocesorul matematic FPA10 pentru procesoarele ARM timpurii acceptă, de asemenea, un format de precizie extinsă cu semnificandul pe 64 de biți (similar cu formatul Intel, deși ocupând 96 de biți, cu 16 biți cu valoarea 0 inserați între câmpurile semn și exponent), dar fără rotunjire corectă.
Formatele x87 și Motorola 68881 pe 80 de biți satisfac cerințele formatului dublu extins IEEE 754-1985, la fel ca și formatul IEEE 754 pe 128 de biți.
Formatul x86 cu precizie extinsă Formatul x86 cu precizie extinsă este un format pe 80 de biți implementat pentru prima dată în coprocesorul matematic Intel 8087 și are suport pe toate procesoarele bazate pe arhitectura x86 care încorporează o unitate pentru virgulă mobilă (FPU).
Intel 8087 a fost primul dispozitiv de tip x86 care avea suport hardware pentru aritmetica în virgulă mobilă. A fost conceput să folosească un format cu „precizie simplă” pe 32 de biți și un format cu „precizie dublă” pe 64 de biți pentru codificarea și interschimbarea numerelor în virgulă mobilă. Formatul extins a fost conceput nu pentru a stoca date cu o precizie mai mare, ci pentru a permite calcularea rezultatelor temporare mai fiabil și mai precis, prin minimizarea erorilor de depășire și rotunjire în calculele intermediare. Toate registrele cu virgulă mobilă din 8087 au acest format, iar numerele se convertesc automat în acest format atunci când se încarcă în registre date din memorie, iar rezultatele se convertesc înapoi în formate convenționale atunci când se stochează conținutul registrelor în memorie. Pentru a permite salvarea rezultatelor expresiilor parțiale intermediare în variabile cu precizie extinsă și continuarea acestora în instrucțiunile limbajului de programare iar calculele întrerupte să se reia de unde au fost întrerupte, arhitectura oferă instrucțiuni care transferă valori între aceste registre interne și memorie fără a se efectua vreo conversie, ceea ce permite accesul la formatul extins pentru calcule. – tratând și problema exactității funcțiilor având ca argumente astfel de numere, dar la o precizie mai mare.
Unitățile în virgulă mobilă (FPU) de pe toate procesoarele x86 ulterioare au avut suport pentru acest format. Ca urmare, se poate dezvolta software care profită de precizia mai mare oferită de acest format. William Kahan, unul dintre principalii proiectanți ai aritmeticii calculatoarelor x87 și ai propunerii inițiale de standard IEEE 754, notează despre dezvoltarea virgulei mobile x87: „A fost inclus un format extins, atât de larg pe cât am îndrăznit (80 de biți), cu același rol de suport ca și formatul intern cu 13 zecimale din calculatoarele cu 10 zecimale de la Hewlett-Packard.” Mai mult, Kahan observă că semnificandul pe 64 de biți a reprezentat cel mai lung semnificand pentru care propagarea bitului de transport (carry) s-a putut face fără a crește timpul ciclului pe 8087, și că precizia extinsă x87 a fost concepută pentru a fi extensibilă la o precizie mai mare în procesoarele viitoare:
„Pentru moment, formatul extins pe 10 octeți este un compromis tolerabil între valoarea aritmeticii extra precise ș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 pe 16 octeți. ... Acest tip de evoluție treptată către o precizie mai mare era deja avut în vedere când a fost elaborat Standardul IEEE 754 pentru aritmetica în virgulă mobilă.”
Acest format pe 80 de biți are: 1 , 15 biți exponent (aceeași lungime ca și cea a exponentului pentru precizia cvadruplă), 64 biți (pentru stocarea efectivă a semnificandului.
Exponentul este de tip deplasat, cu un exces de 16383. O valoare a exponentului de 32767 (toți cei cincisprezece biți sunt „1”) este rezervată pentru a permite reprezentarea stărilor speciale, cum ar fi infinit și NaN. Dacă exponentul este zero (toți cei cincisprezece biți sunt „0”), valoarea este un număr nenormalizat, iar exponentul lui 2 este −16382. Other volumes available at Intel 64 and IA-32 Architectures Software Developer Manuals.
Fișier:X86 Extended Floating Point Format.svg
În tabelul următor, „” este valoarea din bitul semn (0 înseamnă pozitiv, 1 înseamnă negativ), „” este valoarea din câmpului exponentului interpretată ca un număr întreg pozitiv, iar „” este semnificandul, interpretat ca un număr binar pozitiv, unde virgula binară este situată între biții 63 și 62. Câmpul „” este combinația dintre părțile întregi și fracționare din diagrama de mai sus.
{| class="wikitable" |+ Interpretarea câmpurilor unei valori x86 în precizie extinsă ! Exponent !colspan=2| Semnificand !rowspan=2| Ce înseamnă |- !align="center"| !align="center"| !align="center"| |- !rowspan=3| toți 0 |align="center" rowspan=2| 0 ||align="center"| 0 || Zero. Bitul de semn dă semnul lui zero, care de obicei nu are semnificație. |- |align="center"| nenul || Nenormalizat. Valoarea este |- |align="center"| 1 || align="center" | orice || Pseudonenormalizat. 80387 și următoarele interpretează corect această valoare, dar n-o generează. Valoarea este |- !rowspan=4| toți 1 |align="center" rowspan=2| 0 || align="center" | 0 || Pseudoinfinit. Bitul semn indică semnul infinitului. 8087 și 80287 tratează asta drept infinit. 80387 și versiunile ulterioare tratează asta drept operand invalid. |- |align="center"| nenul || PseudoNaN. Valoarea din bitul semn nu are semnificație. 8087 și 80287 tratează asta drept NaN de semnalizare excepție (sNaN). 80387 și versiunile ulterioare tratează asta drept operand invalid. |- |align="center" rowspan=2| 1 || align="center" | 0 || Infinit. Bitul semn indică semnul infinitului. 8087 și 80287 tratează asta drept NaN de semnalizare excepție (sNaN). |- |align="center"| nenul || NaN. Valoarea din bitul semn nu are semnificație. 8087 și 80287 tratează asta drept NaN de semnalizare excepție (sNaN).
Bitul 62 indică un NaN fără semnalizare excepție (qNaN). Dacă toți ceilalți biți sunt zero, acesta este un număr în virgulă mobilă nedefinit, rezultatul unor calcule nevalide, cum ar fi rădăcina pătrată a unui număr negativ, logaritmul unui număr negativ, 0÷0, ∞÷∞, ∞×0 și altele, atunci când procesorul a fost configurat să nu genereze excepții pentru operanzi nevalizi. |- !rowspan=2| oricealtceva |align="center"| 0 || orice || Valoare nenormalizată. Generat doar pe 8087 și 80287. 80387 și versiunile ulterioare tratează acest lucru ca un operand invalid. Valoarea este |- |align="center"| 1 || orice || Valoare normalizată. Valoarea este
Spre deosebire de formatele cu precizie simplă și dublă, acest format nu utilizează un bit implicit (ascuns). Bitul 63 conține partea întreagă a semnificandului, iar biții 62–0 conțin partea fracționară. Bitul 63 va fi 1 pentru toate numerele normalizate. Când 8087 a fost proiectat acest design a avut mai multe avantaje: Calculele pot fi efectuate puțin mai rapid dacă toți biții semnificandului sunt prezenți în registru. Un semnificand pe 64 de biți oferă o precizie suficientă pentru a evita pierderea preciziei atunci când rezultatele sunt convertite înapoi în formatul cu precizie dublă într-un număr foarte mare de cazuri. Acest format oferă un mecanism pentru indicarea pierderii de precizie în cazul depășirii inferioare a valorii inițiale, care poate fi efectuată prin operațiuni ulterioare. De exemplu, calculul generează rezultatul intermediar care este un număr nenormalizat și implică, de asemenea, pierderi de precizie. Produsul tuturor termenilor este care poate fi reprezentat ca un număr normalizat. Coprocesorul 80287 ar putea finaliza acest calcul și indica pierderea preciziei prin returnarea unui rezultat „nenormalizat” (exponent diferit de 0, bitul 63 = 0). Procesoarele începând cu 80387 nu mai generează valori nenormalizate și nu mai acceptă intrări nenormalizate în operații. Acestea vor genera o valoare nenormalizată dacă apare o depășire inferioară, dar vor genera un rezultat normalizat dacă operațiile ulterioare asupra valorii nenormalizate pot fi normalizate.
Exemple Exemplele sunt în reprezentare hexazecimală și zecimală.