IEEE 754 ( IEC 60559) este un standard IEEE utilizat pe scară largă care descrie un format pentru reprezentarea numerelor în virgulă mobilă . Este utilizat în implementări software ( compilatoare ale diferitelor limbaje de programare ) și hardware ( CPU și FPU ) ale operațiilor aritmetice (operații matematice).
Standardul descrie:
Standardul din 2008 înlocuiește IEEE 754-1985 . Noul standard include formate binare din standardul anterior și trei formate noi. Conform standardului actual, o implementare trebuie să suporte cel puțin unul dintre formatele de bază, precum și formatul aritmetic și formatul de schimb.
Lista standardelor:
Versiunea actuală a IEEE 754-2008 a fost publicată în 2008. Acesta completează și înlocuiește versiunea anterioară a IEEE 754-1985 , scrisă de Dan Zuras și editată de Mike Coulishaw..
Standardul internațional ISO/IEC/IEEE 60559:2011 (cu IEEE 754-2008 identic) a fost aprobat și publicat pentru JTC1 /SC 25 conform acordului ISO/IEEE PSDO.
Formatele binare din standardul original sunt incluse în noul standard împreună cu trei formate de bază noi (un binar și două zecimale). Pentru a se conforma standardului actual, o implementare trebuie să implementeze cel puțin unul dintre formatele de bază.
Din septembrie 2015, standardul este revizuit pentru a include clarificări.
Formatul IEEE 754 este „un set de reprezentări de valori numerice și caractere”. Formatul poate include, de asemenea, o metodă de codificare.
Formatul include:
Valorile finale posibile care pot fi reprezentate în format sunt determinate de bază , de numărul de caractere din mantise (cu precizie ) și de valoarea maximă :
Prin urmare (pentru exemplul anterior) cel mai mic număr pozitiv diferit de zero care poate fi reprezentat este , iar cel mai mare este ( ), precum și întreaga gamă de numere de la până la . Numerele și ( și ) sunt cele mai mici (în valoare absolută) numere normale; numerele diferite de zero dintre aceste cele mai mici numere sunt numite subnormale .
Unele numere pot avea mai multe reprezentări în formatul în care tocmai au fost descrise. De exemplu, dacă și , atunci numărul poate fi reprezentat ca: , sau .
Pentru formatele zecimale, orice reprezentare este validă, iar colecția acestor reprezentări se numește cohorte . Când un rezultat poate avea mai multe reprezentări, standardul determină care dintre ele este selectată de un membru al cohortei.
Pentru formatele binare, reprezentarea este făcută unică prin alegerea celui mai mic exponent reprezentabil. Pentru numerele cu un exponent în intervalul normal (nu toate sau toate zerourile), bitul de început al mantisei va fi întotdeauna 1. Prin urmare, bitul de început poate fi implicit mai degrabă decât stocat explicit în memorie. Această regulă se numește convenția de biți de conducere sau convenția de biți ascunși. Regula vă permite să salvați 1 bit de memorie pentru a avea încă un bit de precizie. Bitul principal al convenției nu este folosit pentru numere subnormale; rata lor este în afara intervalului normal de valori.
Standardul definește cinci formate de bază, care sunt denumite după baza lor numerică și numărul de biți utilizați în codificarea lor. Există trei formate binare de bază în virgulă mobilă (codate cu 32, 64 sau 128 de biți) și două formate zecimale în virgulă mobilă (codificate cu 64 sau 128 de biți). Formatele binary32 și binary64 sunt formatele unice și binare IEEE 754-1985. O implementare conformă trebuie să implementeze pe deplin cel puțin unul dintre formatele de bază.
Standardul definește, de asemenea, formate de schimb care generalizează aceste formate de bază. Cele binare necesită un acord cu biții conducători. Tabelul prezintă cele mai mici formate de schimb (inclusiv cele de bază).
Nume | Titlul complet | Baza | Numărul de cifre binare ale mantisei | Numărul de zecimale | Exponent (bit) | Decimal Emax |
Offset exponențial [1] | Emin | Emax | Note |
---|---|---|---|---|---|---|---|---|---|---|
binar16 | jumătate de precizie | 2 | unsprezece | 3.31 | 5 | 4,51 | 2 4 −1 = 15 | −14 | +15 | Nu mainstream |
binar32 | precizie unică | 2 | 24 | 7.22 | opt | 38.23 | 2 7 −1 = 127 | −126 | +127 | |
binar64 | precizie dubla | 2 | 53 | 15.95 | unsprezece | 307,95 | 2 10 −1 = 1023 | −1022 | +1023 | |
binar128 | Precizie cvadruplă | 2 | 113 | 34.02 | cincisprezece | 4931,77 | 2 14 −1 = 16383 | −16382 | +16383 | |
binar256 | Precizie de 8x | 2 | 237 | 71,34 | 19 | 78913.2 | 2 18 −1 = 262143 | −262142 | +262143 | Nu mainstream |
zecimal32 | zece | 7 | 7 | 7,58 | 96 | 101 | −95 | +96 | Nu mainstream | |
zecimal64 | zece | 16 | 16 | 9,58 | 384 | 398 | −383 | +384 | ||
zecimal128 | zece | 34 | 34 | 13.58 | 6144 | 6176 | −6143 | +6144 |
Vă rugăm să rețineți că în tabelul de mai sus, valorile minime sunt pentru numere obișnuite. Reprezentarea specială a numerelor subnormale face posibilă reprezentarea unor numere și mai mici (cu o oarecare pierdere de precizie). De exemplu, cel mai mic număr de precizie dublă mai mare decât zero care poate fi reprezentat în această formă este 2 − 1074 (deoarece 1074 = 1022 + 53 − 1).
Valoarea zecimală este valoarea × log 10 bază , care oferă precizia aproximativă în zecimală.
Decimal E max este emax × log 10 bază, aceasta oferă puterea maximă în zecimală.
După cum sa menționat mai devreme, formatele binary32 și binary64 sunt identice cu formatele IEEE 754-1985 și sunt cele mai comune două formate utilizate în prezent. Figura din dreapta arată precizia absolută pentru formatele binary32 și binary64, variind de la 10 −12 la 10 12 . Un astfel de indicator poate fi utilizat pentru a selecta formatul adecvat, având în vedere valoarea așteptată a numărului și precizia necesară.
Standardul definește, de asemenea, formate de precizie extinse și extensibile, care sunt recomandate pentru o precizie mai mare decât formatele de bază. Formatul de precizie extinsă extinde formatul de bază folosind o precizie mai mare și o gamă mai largă de exponenți. Formatul avansat de precizie permite utilizatorului să specifice o gamă de precizie și exponent. O implementare poate folosi orice reprezentare internă pe care o alege pentru astfel de formate. Tot ce trebuie specificat sunt parametrii b, p și emax. Acești parametri descriu în mod unic setul de numere finite (combinații de semn și exponent pentru o bază dată) pe care îl poate reprezenta.
Standardul nu necesită o implementare pentru a suporta formate precise extinse sau extensibile.
Standardul recomandă ca limbile să ofere o metodă de specificare a valorilor p și emax pentru fiecare bază acceptată b.
Standardul recomandă ca limbile și implementările să accepte un format extins care are o precizie mai mare decât cel mai mare format de bază acceptat pentru fiecare bază b.
Pentru un format extins cu precizie între două formate de bază, intervalul de exponent trebuie să fie la fel de mare ca cel al următorului format de bază mai larg. Deci, de exemplu, un număr binar de precizie extinsă pe 64 de biți trebuie să aibă o valoare emax de cel puțin 16383.
Formatele de schimb sunt concepute pentru a schimba date în virgulă mobilă folosind un șir de biți cu lungime fixă.
Pentru schimbul de numere binare în virgulă mobilă, sunt definite formate de schimb cu lungimea de 16 biți, 32 de biți, 64 de biți și orice multiplu de 32 de biți ≥128. Formatul de 16 biți este destinat schimbului sau stocării de numere mici (de exemplu, pentru calcule grafice sau rețele neuronale).
Schema de codificare pentru aceste formate de schimb binar este aceeași ca și pentru IEEE 754-1985: un bit semn urmat de indici care descriu offset-ul exponentului și p-1 biți care descriu valoarea. Lățimea câmpului exponentului pentru formatul k-biți este calculată ca w = rotund(4 log 2 ( k ))-13. Formatele existente de 64 și 128 de biți urmează această regulă, dar formatele de 16 și 32 de biți au mai mulți biți de putere (5 și respectiv 8 biți) decât oferă această formulă (3 și, respectiv, 7 biți).
Ca și în cazul IEEE 754-1985, există o oarecare flexibilitate în codificarea NaN.
Pentru schimbul de numere zecimale cu virgulă mobilă, formatele de schimb sunt definite pentru orice multiplu de 32 de biți.
Standardul definește cinci reguli de rotunjire. Primele două reguli se rotunjesc la cea mai apropiată valoare, celelalte se numesc runde direcționale.
Mod / Exemplu | +11,5 | +12,5 | −11,5 | −12,5 |
---|---|---|---|---|
la cel mai apropiat (se leagă de par) | +12,0 | +12,0 | −12,0 | −12,0 |
la cel mai apropiat (snap la infinit) | +12,0 | +13,0 | −12,0 | −13,0 |
la 0 | +11,0 | +12,0 | −11,0 | −12,0 |
la + ∞ | +12,0 | +13,0 | −11,0 | −12,0 |
la - ∞ | +11,0 | +12,0 | −12,0 | −13,0 |
Operațiunile necesare pentru un format aritmetic acceptat (inclusiv formatele de bază) includ:
Standardul oferă un predicat totalOrder care definește ordinea totală pentru toate numerele în virgulă mobilă pentru fiecare format. Predicatul este în concordanță cu operațiunile obișnuite de comparație. Cu toate acestea, operațiunile normale de comparare tratează NaN-urile ca neordonate și compară -0 și +0 ca egale. Predicatul totalOrder va ordona aceste cazuri și, de asemenea, va face distincția între diferite reprezentări ale NaN pentru același număr în virgulă mobilă codificat în moduri diferite.
IEEE | Standardele|||||||
---|---|---|---|---|---|---|---|
Actual |
| ||||||
Seria 802 |
| ||||||
Seria P |
| ||||||
Înlocuit | |||||||
|