IEEE 754

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Standardul IEEE pentru calcul în virgulă mobilă ( IEEE 754 ) (oficial: IEEE Standard for Binary Floating-Point Arithmetic (ANSI / IEEE Std 754-1985) sau, de asemenea, IEC 60559: 1989, Aritmetica în virgulă mobilă binară pentru sistemele cu microprocesor ) cel mai răspândit standard în domeniul calculului automat. Acest standard definește formatul pentru reprezentarea numerelor în virgulă mobilă (inclusiv ± 0 și numerele denormalizate ; infinitive și NaN , „ nu un număr ”) și un set de operații care pot fi efectuate pe acestea. De asemenea, specifică patru metode de rotunjire și descrie cinci excepții.

Există patru formate pentru numerele cu virgulă mobilă în acest standard: precizie simplă (32 biți), precizie dublă (64 biți), precizie unică extinsă (≥ 43 biți), utilizată rar și precizie dublă extinsă (≥ 79 biți), de obicei acceptată cu 80 de biți. Precizia unică este minimul cerut de standard, celelalte sunt opționale.

Structura unui număr în virgulă mobilă

Un număr în virgulă mobilă, conform standardului IEEE, este reprezentat pe cuvinte de 32, 64 sau 128 biți împărțiți în trei părți:

in aceasta ordine. N biții unui șir sunt indexați în ordine descrescătoare cu numere întregi de la 0 la n -1. Într-un număr din acest standard, importanța bitului scade odată cu indicele său.

Numere pe 32 de biți

Un număr într-un șir de 32 de biți este reprezentat mai jos:

 1 8 23 lungime în biți
+ - + -------- + ----------------------- +
| S | Exp. | Mantissa |
+ - + -------- + ----------------------- +
31 30 22 0 bit index

Valoarea numărului reprezentat poate fi calculată ca:

Câmpul s specifică semnul numărului: 0 pentru numerele pozitive, 1 pentru numerele negative. Câmpul e conține exponentul numărului sub formă de număr întreg. Fiind format din 8 biți, permite reprezentarea a 256 de valori. Valorile 0 și 255 sunt rezervate pentru funcții speciale (descrise mai târziu); celelalte permit să reprezinte 254 de valori pentru numere în formă normală , între -126 și 127, deoarece acest câmp trebuie să fie capabil să reprezinte atât numere uriașe cât și minime; totuși, folosind metoda utilizată pentru reprezentarea semnului numerelor întregi, s-ar crea probleme pentru comparația între numere. Pentru a rezolva această problemă, câmpul este reprezentat în exces k numit bias (care este egal cu 2 ^ (n-1) -1 cu n numărul de biți ai exponentului), deci:

e = E + k

și reciproc

E = e - k

În acest standard, pentru numerele cu o singură precizie, polarizarea este egală cu 127. În această reprezentare (denumită polarizare), valorile exponentului între -126 și 127 iau, atunci când scriu octetul, valorile dintre 1 și 254, eliminând necesitatea unui bit rezervat pentru semn. La decodarea numărului, părtinirea este scăzută din nou pentru a recupera valoarea inițială.

 [-126, ..., 0, ..., 127] -> [-126 +127 , ..., 0 +127 , ..., 127 +127 ] -> [1, ..., 127 , ..., 254] -> [00000001, ..., 01111111, ..., 11111110]

Valorile asumate de exponentul e și de mantisa m determină dacă numărul aparține uneia dintre aceste categorii:

  • zerouri;
  • numere în formă normală;
  • numere sub formă denormalizată ;
  • infinit;
  • NaN ( nu un număr ).

Exponentul distinge numerele într-un mod primar, mantisa într-un mod secundar.

Categorie Exp. Mantissa
Zero 0 0
Numere denormalizate 0 nu zero
Numere normalizate 1-254 tot ceea ce
Infinit 255 0
Nan (nu un număr) 255 nu zero

Câmpul m este un șir de biți care reprezintă secvența de cifre după virgulă. Toate mantisele sunt normalizate astfel încât numărul dinaintea virgulei să fie 1, deci pentru un m dat valoarea matematică corespunzătoare este

M = 1, m

În practică, mantisa este alcătuită din numărul binar 1 , urmat de virgulă și partea întreagă a numărului reprezentat, sub formă binară; mantisa este astfel artificial între 1 și 2. Când un număr este normalizat, așa cum arată exponentul său, primul bit al mantissei , egal cu 1, este omis pentru comoditate: se numește, prin urmare, bitul ascuns sau bitul implicit .

Cu acest sistem de reprezentare, există două zerouri (+0 și −0) și două infinitive (+ ∞ și −∞) în funcție de valoarea primului bit. Mai mult, numerele subnormale pot avea un semn și o mantisă , dar sunt utile doar pentru analiză.

Acest sistem de reprezentare permite să aibă o precizie relativă aproape constantă x pentru toate valorile reprezentabile. Intr-adevar

Să luăm un exemplu simplu: codificăm numărul -118,5 în sistemul IEEE 754.

Trebuie să îi determinăm semnul, exponentul și mantisa .

Deoarece este un număr negativ, primul bit este „1”.

Apoi scriem numărul în formă binară : 1110110.1.

Apoi mutăm virgula spre stânga, lăsând doar 1 la stânga: .

Mantisa este partea din dreapta virgulei, căptușită cu zerouri în dreapta pentru a umple cei 23 de biți: 1101101000000000000000000.

Exponentul este egal cu 6, dar trebuie să-l convertim în formă binară și să-l adaptăm la standard. Pentru o singură precizie, trebuie să adăugăm 127. Deci 6 + 127 = 133. În formă binară: 10000101.

Asamblarea tuturor:

 1 8 23
+ - + -------- + ----------------------- +
| S | Esp | Mantissa |
| 1 | 10000101 | 11011010000000000000000 |
+ - + -------- + ----------------------- +
31 30 22 0

Numere pe 64 de biți

Precizia pe 64 de biți este dublă față de precizia pe 32 de biți luată ca bază de standard:

 1 11 52
+ - + ----------- + ----------------------------------- ----------------- +
| S | Esp | Mantissa |
+ - + ----------- + ----------------------------------- ----------------- +
63 62 51 0

NaN-urile și infinitele sunt reprezentate cu exponenți formați dintr-o serie de 1 (egal cu 2047).

Pentru numerele normalizate tendința este egală cu 1023 (deci e = E + 1023). Pentru numerele denormalizate exponentul este −1022 (cel mai mic exponent pentru un număr normalizat). Ca și înainte, atât infinitele, cât și zerourile pot fi reprezentate cu ambele semne.

Precizia zecimală este de aproximativ 16 cifre zecimale.

Numere pe 128 de biți

În cele din urmă, standardul reglementează numerele de 128 de biți, care permit o precizie cvadruplă în comparație cu numerele de 32 de biți asumate ca bază de standard:

 1 15 112
+ - + --------------- + ------------------------------- -------------------------------------------------- +
| S | Esp | Mantissa |
+ - + --------------- + ------------------------------- -------------------------------------------------- +

Numărul de biți dedicați exponentului crește de la 11 la 15, iar cei pentru mantisă la 112.

Precizia totală crește la aproximativ 34 de zecimale.

Biasul exponentului este egal cu 16383 (deci e = E - 16383).

Revizuirea standardului

Standardul este în prezent în curs de revizuire ( IEEE 754r ).

Conversie din format zecimal în format P754

Există nenumărate modalități de a reprezenta numerele în virgulă mobilă, dar cel mai utilizat sistem este standardul IEEE P754; această metodă implică utilizarea notației științifice, în care fiecare număr este identificat prin semn, printr-o mantisă (1, xxxxx) și prin exponent ( ). Procedura standard pentru conversia de la numărul zecimal la numărul binar P754 este după cum urmează:

  1. În primul rând, numărul, în valoare absolută, trebuie convertit în binar.
  2. Numărul este apoi împărțit (sau înmulțit) cu 2 pentru a obține o formă de tip 1, xxxxxx.
  3. Primul 1 al acestui număr este șters (pentru a economisi memorie)
  4. Numărul de ori cu care numărul a fost împărțit (sau înmulțit și, în acest caz, valoarea va fi negativă) cu 2 reprezintă exponentul: această valoare (zecimală) trebuie să fie exprimată peste 127, adică este necesar să adăugați 127 și convertiți numărul rezultat în binar. În cazul reprezentării cu precizie dublă (a se vedea definiția următoare), valoarea exponentului este exprimată peste 1023.

În acest moment am colectat toate datele necesare pentru stocarea numărului: pe baza numărului de biți pe care îi avem la dispoziție putem folosi trei formate: formatul de precizie unică (32 biți), formatul de precizie dublă (64 biți) și cvadruplul format de precizie (128 biți).

  1. În primul caz, putem scrie valoarea folosind 1 bit pentru semn, 8 biți pentru exponent și 23 de biți pentru mantisă.
  2. În al doilea caz, va fi necesar 1 bit pentru semn, 11 biți pentru exponent și 52 pentru mantisă.
  3. În al treilea caz, va fi necesar 1 bit pentru semn, 15 biți pentru exponent și 112 pentru mantisă.

De exemplu, să convertim valoarea în binar P754 single:

  1. Să convertim numărul mai întâi: pentru întreaga parte e . Deci numărul final este (semn exclus).
  2. Apoi împărțim numărul la 2 pentru a obține următoarea notație:
  3. Mantisa devine apoi: 1100101.
  4. Pentru a exprima exponentul în exces 127, în cele din urmă:

Numărul, la final, va fi exprimat în formatul:

1 10000010 1100101000000000000000000

Exemplu de calcul pentru numere cu o singură precizie (32 de biți)

Să luăm de exemplu numărul fracțional negativ:

 -5.828125

Să transformăm întreaga parte în binar:

 5: 2 = 2 R = 1
2: 2 = 1 R = 0
1: 2 = 0 R = 1
5 (10) = 101 (2)

Să transformăm acum partea zecimală în binar:

 0,828125 * 2 = 1,65625 U = 1
0,65625 * 2 = 1,3125 U = 1
0,3125 * 2 = 0,625 U = 0
0,625 * 2 = 1,25 U = 1
0,25 * 2 = 0,5 U = 0
0,5 * 2 = 1 U = 1
0,828125 (10) = 110101 (2)

Să combinăm acum cele două părți:

 101.110101

Mutăm virgula două locuri spre stânga rescriind rezultatul în acest fel:

 1.01110101 * 2 ^ 2

Apoi Obținem partea inițială a noastră mantisei 01110101, și după ce sa mutat punctul zecimal la stânga cu două poziții pentru a obține același număr, trebuie să ne multiplica 2 pătrat.

În acest moment obținem exponentul adăugând 2 la polarizare :

 2 + 127 = 129

Să transformăm acest număr în binar:

 129: 2 = 64 R = 1
 64: 2 = 32 R = 0
 32: 2 = 16 R = 0
 16: 2 = 8 R = 0
  8: 2 = 4 R = 0
  4: 2 = 2 R = 0
  2: 2 = 1 R = 0
  1: 2 = 0 R = 1
129 (10) = 10000001 (2)

Am obținut astfel numărul nostru în virgulă mobilă amintindu-ne să setăm bitul de semn la 1, deoarece am pornit de la un număr negativ:

 -5.828125 (10) = 1 | 1000 0001 | 0111 0101 0000 0000 0000 000 (2)

Dacă acum dorim să exprimăm numărul găsit în hexazecimal (fără a lua în considerare posibilul format Little Endian care ar modifica aranjamentul octeților) trebuie doar să îl împărțim în grupuri de patru și să găsim valorile hexazecimale corespunzătoare:

 1100 0000 1011 1010 1000 0000 0000 0000
 C 0 BA 8 0 0 0

În baza șaisprezece, numărul nostru standard în virgulă mobilă IEEE 754 va fi:

 C0BA8000

Elemente conexe

Alte proiecte

linkuri externe