Formatul în virgulă mobilă cu precizie simplă
Formatul în virgulă mobilă cu precizie simplă,[1] abreviat FP32[2], float32, sau float[2] este un format de reprezentare în memoria calculatoarelor a numerelor reale. Reprezentarea ocupă 32 de biți și poate reprezenta în sistemul virgulă mobilă o gamă mult mai largă de numere decât sistemul virgulă fixă, cu o oarecare diminuare a preciziei. În virgulă fixă o variabilă cu semn reprezentată pe 32 de biți poate avea o valoare maximă de în timp în virgulă mobilă pe 32 de biți în bază 2 poate avea o valoare maximă de Toate numerele întregi cu șapte sau mai puține cifre zecimale și orice 2n pentru un număr întreg −149 ≤ n ≤ 127 pot fi convertite exact într-o valoare în virgulă mobilă cu precizie simplă IEEE 754.
În standardul IEEE 754 formatul în baza 2 pe 32 de biți este denumit oficial binary32; a fost numit single în IEEE 754-1985. IEEE 754 specifică tipuri suplimentare de virgulă mobilă, cum ar fi formatul în baza 2 pe 64 de biți precizie dublă și, mai recent, reprezentări în baza 10.
Unul dintre primele limbaje de programare care au oferit tipuri de date în virgulă mobilă cu precizie simplă și dublă 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 computerului și de modelul computerului, precum și de deciziile luate de proiectanții limbajelor de programare. De exemplu, tipul de date cu precizie simplă al GW-BASIC era formatul în virgulă mobilă 32-bit MBF(d).
Precizia simplă este descrisă REAL(4) sau REAL*4 în Fortran;[3] SINGLE-FLOAT în Common Lisp;[4] float binary(p) cu p ≤ 21, float decimal(p) cu valoarea maximă a lui p depinzând de aplicarea atributului DFP (IEEE 754 DFP) în PL/I; float în C cu suport IEEE 754, C++ (dacă este în C), C# și Java;[5] Float în Haskell[6] și Swift;[7] Single în Object Pascal, Delphi), Visual Basic și MATLAB. Însă float în Python, Ruby, PHP și OCaml(d) precum și single în versiuni ale GNU Octave anterioare versiunii 3.2 se referă la numere reprezentate în precizie dublă. În cele mai multe implementări ale PostScript și unele sisteme înglobate este disponibilă doar reprezentarea în virgulă mobilă cu precizie simplă.
Standardul IEEE 754: binary32
[modificare | modificare sursă]Standardul IEEE 754 descrie binary32 ca având:
- 1 bit semn(d),
- 8 biți exponent,
- 24 biți (din care stocați efectiv 23) de semnificand.
Aceasta oferă o precizie de la 6 la 9 [[cifră semnificativă |cifre zecimale semnificative}}. Dacă un șir zecimal cu cel mult 6 cifre semnificative este convertit în formatul IEEE 754 cu precizie simplă, 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 simplă este convertit într-un șir zecimal cu cel puțin 9 cifre semnificative și apoi convertit înapoi la reprezentare cu precizie simplă, rezultatul final trebuie să corespundă cu numărul original.[8]
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 8 biți de la 0 la 255, în forma exponent deplasat cu exces[1] 127: valoarea 127 corespunde exponentului 0. Exponenții variază de la −126 la +127 (deci de la 1 la 254 î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 NaN(d)).
Semnificandul complet al numerelor normale are 23 de biți de mantisă 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 23 de biți de fracție ai semnificandului apar în formatul de memorie, dar precizia totală este de 24 de biți (echivalent cu lg(224) ≈ 7,225 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.
Biții sunt poziționați în modul următor:
Valoarea reală a unei date binary32 pe 32 de biți cu un semn dat, un exponent deplasat E (întreg fără semn pe 8 biți) și o parte fracționară pe 23 de biți este:
care produce
În exemplul din imagine:
- .
astfel:
Valori particulare în reprezentarea binary32
[modificare | modificare sursă]Exemplele sunt în reprezentare binară, hexazecimală și zecimală.
| Binar | Hexa | Calcul | Valoare | Observații |
|---|---|---|---|---|
| 0 00000000 00000000000000000000001 | 0000 0001 | 2−126 × 2−23 = 2−149 | ≈1,4012984643×10−45 | Cel mai mic număr pozitiv nenormalizat |
| 0 00000000 11111111111111111111111 | 007f ffff | 2−126 × (1 − 2−23) | ≈1,1754942107×10−38 | Cel mai mare număr pozitiv nenormalizat |
| 0 00000001 00000000000000000000000 | 0080 0000 | 2−126 | ≈1,1754943508×10−38 | Cel mai mic număr pozitiv normalizat |
| 0 11111110 11111111111111111111111 | 7f7f ffff | 2127 × (2 − 2−23) | ≈3,4028234664×1038 | Cel mai mare număr normalizat |
| 0 01111110 11111111111111111111111 | 3f7f ffff | 1 − 2−24 | ≈0,999999940395355225 | Cel mai mare număr subunitar |
| 0 01111111 00000000000000000000000 | 3f80 0000 | 1 (unu) | ||
| 0 01111111 00000000000000000000001 | 3f80 0001 | 1 + 2−23 | ≈1,00000011920928955 |
Cel mai mic număr supraunitar |
| 1 10000000 00000000000000000000000 | c000 0000 | −2 | ||
| 0 00000000 00000000000000000000000 | 0000 0000 | 0 | ||
| 1 00000000 00000000000000000000000 | 8000 0000 | −0 | ||
| 0 11111111 00000000000000000000000 | 7f80 0000 | infinit | ||
| 1 11111111 00000000000000000000000 | ff80 0000 | −infinit | ||
| 0 01111101 01010101010101010101011 | 3eaa aaab | ≈0,333333343267440796 | 1/3 | |
| 0 10000000 10010010000111111011011 | 4049 0fdb | ≈3,14159274101257324 | π (pi) | |
| x 11111111 10000000000000000000001 | ffc0 0001 | qNaN (procesoare x86, ARM) | ||
| x 11111111 00000000000000000000001 | ff80 0001 | sNaN (procesoare x86, ARM) |
Implicit, 1/3 este rotunjit în sus, în loc de în jos, ca în precizie dublă, datorită numărului par de biți din semnificant. Biții de 1/3 dincolo de punctul de rotunjire sunt 1010..., care este mai mult 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 PA-RISC(d) utilizează bitul pentru a indica un NaN de semnalizare (sNaN).
Precizia reprezentării numerelor zecimale
[modificare | modificare sursă]În tabel sunt prezentate intervalele de precizie la reprezentarea numerelor fracționare, respectiv a numerelor întregi. Pentru numerele negative precizia este aceeași ca la numerele pozitive.
| Numere fracționare | Numere întregi | |||||
|---|---|---|---|---|---|---|
| De la | Până la | Interval de precizie | De la | Până la | Interval de precizie | |
| 1 | 2 | 2−23 | 0 | 16777216 | reprezentabile exact | |
| 2 | 4 | 2−22 | 224 =16777216 |
225 =33554432 |
rotunjite la multiplu de 2 | |
| 4 | 8 | 2−21 | 225 | 226 | rotunjite la multiplu de 4 | |
| 2n | 2n+1 | 2n−23 | 2n | 2n+1 | rotunjite la multiplu de 2n−23 | |
| 222 =4194304 |
223 =8388608 |
2−1 = 0,5 | 2127 | 2128 | rotunjite la multiplu de 2104 | |
| 223 =8388608 |
224 =16777216 |
20 = 1 | 2128 | peste | rotunjite la „infinit” | |
Note
[modificare | modificare sursă]- ^ a b Baruch, Zoltan Francisc (). „2.6. Reprezentarea numerelor în virgulă mobilă”. Arhitectura calculatoarelor (PDF). Cluj-Napoca: Todesco. pp. 26–34. Accesat în .
- ^ a b Lupulescu, Grigore; Carabaș, Costin; Ciocârlan, Ștefan-Dan (). „Laboratorul 08 - Arhitectura GPU NVIDIA CUDA” (PDF). Universitatea Politehnica din București. Accesat în .
- ^ en „REAL Statement”. scc.ustc.edu.cn. Arhivat din original la . Accesat în .
- ^ en „CLHS: Type SHORT-FLOAT, SINGLE-FLOAT, DOUBLE-FLOAT..”. www.lispworks.com.
- ^ en „Primitive Data Types”. Java Documentation.
- ^ en „6 Predefined Types and Classes”. haskell.org. .
- ^ en „Float”. Apple Developer Documentation.
- ^ en William Kahan (). „Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic” (PDF). p. 4. Arhivat din original (PDF) la .
Vezi și
[modificare | modificare sursă]- Formatul în virgulă mobilă cu semiprecizie
- Formatul în virgulă mobilă cu precizie dublă
- Formatul în virgulă mobilă cu precizie cvadruplă
- Notația științifică
- Precizie extinsă
- Stabilitate numerică
Legături externe
[modificare | modificare sursă]
Materiale media legate de formate în virgulă mobilă la Wikimedia Commons- en Live floating-point bit pattern editor
- en Online calculator
- en Online converter for IEEE 754 numbers with single precision