Punct plutitor zecimal - Decimal floating point
| Formate în virgulă mobilă |
|---|
| IEEE 754 |
|
| Alte |
| Lățimea de biți a arhitecturii computerului |
|---|
| Pic |
| Cerere |
| Precizie binară în virgulă mobilă |
| Precizie în virgulă mobilă zecimală |
Zecimale în virgulă mobilă ( DFP ) aritmetică se referă atât la o reprezentare și operații asupra zecimali virgulă mobilă numere. Lucrul direct cu fracții zecimale (baza-10) poate evita erorile de rotunjire care altfel apar de obicei la conversia între fracțiile zecimale (obișnuite în datele introduse de om, cum ar fi măsurători sau informații financiare) și fracțiile binare (baza-2).
Avantajul reprezentării în virgulă mobilă zecimală în comparație cu reprezentarea zecimală în virgulă fixă și întreagă este că acceptă o gamă mult mai largă de valori. De exemplu, în timp ce o reprezentare cu punct fix care alocă 8 cifre zecimale și 2 zecimale poate reprezenta numerele 123456.78, 8765.43, 123.00 și așa mai departe, o reprezentare în virgulă mobilă cu 8 cifre zecimale ar putea reprezenta, de asemenea, 1,2345678, 1234567,8, 0,000012345678, 12345678000000000 și așa mai departe. Această gamă mai largă poate încetini dramatic acumularea erorilor de rotunjire în timpul calculelor succesive; de exemplu, algoritmul de însumare Kahan poate fi utilizat în virgulă mobilă pentru a adăuga multe numere fără acumulare asimptotică de eroare de rotunjire.
Implementări
Utilizările mecanice timpurii ale virgulelor zecimale sunt evidente în abac , regula slide , calculatorul Smallwood și alte calculatoare care acceptă intrări în notația științifică . În cazul calculatoarelor mecanice, exponentul este adesea tratat ca informații laterale care sunt contabilizate separat.
IBM 650 de calculator sprijinit o zecimală de 8 cifre în virgulă flotantă format în 1953. în caz contrar binar Wang VS aparatul sprijinit o zecimală pe 64 de biți format în virgulă mobilă în 1977. Biblioteca de sprijin în virgulă mobilă pentru 68040 Motorola procesor furnizat un 96 format de stocare cu virgulă mobilă zecimală pe biți în 1990.
Unele limbaje de calculator au implementări de aritmetică în virgulă mobilă zecimală, inclusiv PL / I , C # , Java cu zecimală mare, emacs cu calc și modulul zecimal al Python . În 1987, IEEE a lansat IEEE 854 , un standard pentru calcul cu virgulă virgulă zecimală, care nu avea o specificație pentru modul în care datele cu virgulă mobilă ar trebui codificate pentru schimbul cu alte sisteme. Acest lucru a fost ulterior abordat în IEEE 754-2008 , care a standardizat codificarea datelor zecimale în virgulă mobilă, deși cu două metode alternative diferite.
Procesoarele IBM POWER6 și cele mai noi POWER includ DFP în hardware, la fel ca IBM System z9 (și ulterior mașinile zSeries). SilMinds oferă SilAx, un coprocesor vector DFP configurabil . IEEE 754-2008 definește acest lucru mai detaliat. Fujitsu are, de asemenea, procesoare 64-bit Sparc cu DFP în hardware.
Microsoft C # sau .NET utilizează System.Decimal.
Codificare IEEE 754-2008
Standardul IEEE 754-2008 definește reprezentări în virgulă mobilă zecimală pe 32, 64 și 128 de biți. La fel ca formatele binare în virgulă mobilă, numărul este împărțit într-un semn, un exponent și un semnificație . Spre deosebire de virgula mobilă binară, numerele nu sunt neapărat normalizate; valorile cu câteva cifre semnificative au multiple reprezentări posibile: 1 × 10 2 = 0,1 × 10 3 = 0,01 × 10 4 , etc. Când semnificația este zero, exponentul poate fi orice valoare.
| zecimal32 | zecimal64 | zecimal128 | zecimal (32 k ) | Format |
|---|---|---|---|---|
| 1 | 1 | 1 | 1 | Câmp semn (biți) |
| 5 | 5 | 5 | 5 | Câmp combinat (biți) |
| 6 | 8 | 12 | w = 2 × k + 4 | Câmp de continuare a componentelor (biți) |
| 20 | 50 | 110 | t = 30 × k −10 | Câmp de continuare a coeficientului (biți) |
| 32 | 64 | 128 | 32 × k | Dimensiunea totală (biți) |
| 7 | 16 | 34 | p = 3 × t / 10 + 1 = 9 × k −2 | Dimensiunea coeficientului (cifre zecimale) |
| 192 | 768 | 12288 | 3 × 2 w = 48 × 4 k | Intervalul de componente |
| 96 | 384 | 6144 | Emax = 3 × 2 w −1 | Cea mai mare valoare este de 9,99 ... × 10 Emax |
| −95 | −383 | −6143 | Emin = 1 − Emax | Cea mai mică valoare normalizată este 1,00 ... × 10 Emin |
| −101 | −398 | −6176 | Etiny = 2 − p − Emax | Cea mai mică valoare diferită de zero este 1 × 10 Etiny |
Intervalele exponenților au fost alese astfel încât intervalul disponibil pentru valorile normalizate să fie aproximativ simetric. Deoarece acest lucru nu se poate face exact cu un număr par de valori ale exponenților posibili, valoarea suplimentară a fost dată lui Emax.
Sunt definite două reprezentări diferite:
- Unul cu un câmp întreg semnificand binar codifică semnificația ca un întreg binar mare între 0 și 10 p −1. Acest lucru este de așteptat să fie mai convenabil pentru implementările de software care utilizează un ALU binar .
- Un alt cu un câmp semnificativ zecimal dens ambalat codifică cifrele zecimale mai direct. Acest lucru face ca conversia la și de la forma binară în virgulă mobilă să fie mai rapidă, dar necesită hardware specializat pentru a manipula eficient. Acest lucru este de așteptat să fie mai convenabil pentru implementările hardware.
Ambele alternative oferă exact același interval de valori reprezentabile.
Cei mai semnificativi doi biți ai exponentului sunt limitați la intervalul 0−2, iar cei mai semnificativi 4 biți ai semnificației sunt limitați la intervalul 0−9. Cele 30 de combinații posibile sunt codificate într-un câmp de 5 biți, împreună cu forme speciale pentru infinit și NaN .
Dacă cei mai semnificativi 4 biți ai semnificației sunt între 0 și 7, valoarea codificată începe astfel:
s 00mmm xxx Exponent begins with 00, significand with 0mmm s 01mmm xxx Exponent begins with 01, significand with 0mmm s 10mmm xxx Exponent begins with 10, significand with 0mmm
Dacă primii 4 biți ai semnificației sunt binar 1000 sau 1001 (zecimal 8 sau 9), numărul începe astfel:
s 1100m xxx Exponent begins with 00, significand with 100m s 1101m xxx Exponent begins with 01, significand with 100m s 1110m xxx Exponent begins with 10, significand with 100m
Bitul principal (s în cele de mai sus) este un bit de semn și următorii biți (xxx în cele de mai sus) codifică biții exponenți suplimentari și restul celei mai semnificative cifre, dar detaliile variază în funcție de alternativa de codificare utilizată.
Combinațiile finale sunt utilizate pentru infinit și NaN și sunt aceleași pentru ambele codificări alternative:
s 11110 x ±Infinity (see Extended real number line) s 11111 0 quiet NaN (sign bit ignored) s 11111 1 signaling NaN (sign bit ignored)
În ultimele cazuri, toți ceilalți biți ai codării sunt ignorați. Astfel, este posibilă inițializarea unui tablou către NaN prin umplerea acestuia cu o valoare de un singur octet.
Câmp binar de semnificație a numărului întreg
Acest format folosește o semnificație binară de la 0 la 10 p -1. De exemplu, semnificația Decimal32 poate fi de până la 10 7 −1 = 9 999 999 = 98967F 16 = 1001 1000100101 1001111111 2 . În timp ce codificarea poate reprezenta semnificații mai mari, acestea sunt ilegale și standardul necesită implementări pentru a le trata ca 0, dacă este întâlnit la intrare.
Așa cum este descris mai sus, codificarea variază în funcție de faptul dacă cei mai semnificativi 4 biți ai semnificației sunt în intervalul 0 până la 7 (0000 2 la 0111 2 ), sau mai mare (1000 2 sau 1001 2 ).
Dacă cei 2 biți după bitul de semn sunt „00”, „01” sau „10”, atunci câmpul exponentului este format din cei 8 biți care urmează bitului de semn (cei 2 biți menționați plus 6 biți de „câmp de continuare a exponentului”) , iar semnificația este restul de 23 de biți, cu un bit implicit de conducere 0, prezentat aici între paranteze:
s 00eeeeee (0)ttt tttttttttt tttttttttt s 01eeeeee (0)ttt tttttttttt tttttttttt s 10eeeeee (0)ttt tttttttttt tttttttttt
Aceasta include numere subnormale în care cifra de semnificație principală este 0.
Dacă cei 2 biți după bitul de semn sunt "11", atunci câmpul exponentului de 8 biți este deplasat cu 2 biți spre dreapta (după atât bitul de semn, cât și cei "11" biți după aceea), iar semnificația reprezentată este în restul 21 de biți. În acest caz, există o secvență de 3 biți "100" implicită (adică nu este stocată) în semnificația adevărată:
s 1100eeeeee (100)t tttttttttt tttttttttt s 1101eeeeee (100)t tttttttttt tttttttttt s 1110eeeeee (100)t tttttttttt tttttttttt
Secvența "11" de 2 biți după bitul de semn indică faptul că există un prefix implicit de "100" pe 3 biți la semnificație.
Rețineți că biții de conducere ai câmpului de semnificație și nu codifică cea mai semnificativă cifră zecimală; ele fac pur și simplu parte dintr-un număr pur-binar mai mare. De exemplu, o semnificație de 8 000 000 este codificată ca binară 0111 1010000100 1000000000 , cu cei 4 biți de bază care codifică 7; prima semnificație care necesită un al 24-lea bit (și deci a doua formă de codificare) este 2 23 = 8 388 608 .
În cazurile de mai sus, valoarea reprezentată este:
- (−1) semn × 10 exponent − 101 × semnificație
Decimal64 și Decimal128 funcționează în mod analog, dar cu continuare exponentă mai mare și câmpuri de semnificație. Pentru Decimal128, a doua formă de codificare nu este de fapt folosită niciodată; cea mai mare semnificație validă de 10 34 −1 = 1ED09BEAD87C0378D8E63FFFFFFFF 16 poate fi reprezentată în 113 biți.
Câmp semnificativ zecimal ambalat dens
În această versiune, semnificația este stocată ca o serie de cifre zecimale. Cifra principală este cuprinsă între 0 și 9 (3 sau 4 biți binari), iar restul semnificației utilizează codificarea zecimală dens ambalată (DPD).
Primii 2 biți ai exponentului și cifra principală (3 sau 4 biți) a semnificației sunt combinate în cei cinci biți care urmează bitul semnului. Acesta este urmat de un câmp de continuare a exponentului cu offset fix.
În cele din urmă, câmpul de semnificație și continuare format din 2, 5 sau 11 declete de 10 biți , fiecare codificând 3 cifre zecimale.
Dacă primii doi biți după bitul de semn sunt „00”, „01” sau „10”, atunci aceștia sunt biții principali ai exponentului, iar cei trei biți de după aceea sunt interpretați ca cifră zecimală principală (0 la 7 ):
Comb. Exponent Significand s 00 TTT (00)eeeeee (0TTT)[tttttttttt][tttttttttt] s 01 TTT (01)eeeeee (0TTT)[tttttttttt][tttttttttt] s 10 TTT (10)eeeeee (0TTT)[tttttttttt][tttttttttt]
Dacă primii doi biți după bitul de semn sunt „11”, atunci al doilea doi biți sunt biții principali ai exponentului, iar ultimul bit este prefixat cu „100” pentru a forma cifra zecimală principală (8 sau 9):
Comb. Exponent Significand s 1100 T (00)eeeeee (100T)[tttttttttt][tttttttttt] s 1101 T (01)eeeeee (100T)[tttttttttt][tttttttttt] s 1110 T (10)eeeeee (100T)[tttttttttt][tttttttttt]
Celelalte două combinații (11110 și 11111) ale câmpului de 5 biți sunt utilizate pentru a reprezenta ± infinit și respectiv NaN.
Operații aritmetice în virgulă mobilă
Regula obișnuită pentru efectuarea aritmeticii în virgulă mobilă este că se calculează valoarea matematică exactă, iar rezultatul este apoi rotunjit la cea mai apropiată valoare reprezentabilă în precizia specificată. Acesta este, de fapt, comportamentul impus pentru hardware-ul computerului conform IEEE, în condiții normale de rotunjire și în absența unor condiții excepționale.
Pentru ușurință în prezentare și înțelegere, precizia de 7 cifre va fi utilizată în exemple. Principiile fundamentale sunt aceleași în orice precizie.
Plus
O metodă simplă de a adăuga numere în virgulă mobilă este reprezentarea lor mai întâi cu același exponent. În exemplul de mai jos, al doilea număr este deplasat la dreapta cu 3 cifre. Continuăm cu metoda obișnuită de adăugare:
Următorul exemplu este zecimal, ceea ce înseamnă pur și simplu că baza este 10.
123456.7 = 1.234567 × 105 101.7654 = 1.017654 × 102 = 0.001017654 × 105
Prin urmare:
123456.7 + 101.7654 = (1.234567 × 105) + (1.017654 × 102)
= (1.234567 × 105) + (0.001017654 × 105)
= 105 × (1.234567 + 0.001017654)
= 105 × 1.235584654
Aceasta nu este altceva decât convertirea la notație științifică . Detaliat:
e=5; s=1.234567 (123456.7) + e=2; s=1.017654 (101.7654)
e=5; s=1.234567 + e=5; s=0.001017654 (after shifting) -------------------- e=5; s=1.235584654 (true sum: 123558.4654)
Acesta este adevăratul rezultat, suma exactă a operanzilor. Acesta va fi rotunjit la 7 cifre și apoi normalizat, dacă este necesar. Rezultatul final este:
e=5; s=1.235585 (final sum: 123558.5)
Rețineți că cele 3 cifre reduse ale celui de-al doilea operand (654) se pierd în esență. Aceasta este o eroare rotundă . În cazuri extreme, suma a două numere diferite de zero poate fi egală cu unul dintre ele:
e=5; s=1.234567 + e=−3; s=9.876543
e=5; s=1.234567 + e=5; s=0.00000009876543 (after shifting) ---------------------- e=5; s=1.23456709876543 (true sum) e=5; s=1.234567 (after rounding/normalization)
O altă problemă a pierderii semnificației apare atunci când se scad două numere apropiate. e = 5; s = 1,234571 și e = 5; s = 1,234567 sunt reprezentări ale raționalelor 123457.1467 și 123456.659.
e=5; s=1.234571 − e=5; s=1.234567 ---------------- e=5; s=0.000004 e=−1; s=4.000000 (after rounding/normalization)
Cea mai bună reprezentare a acestei diferențe este e = -1; s = 4.877000, care diferă mai mult de 20% de e = -1; s = 4.000000. În cazuri extreme, rezultatul final poate fi zero, chiar dacă un calcul exact poate fi de câteva milioane. Această anulare ilustrează pericolul presupunerii că toate cifrele unui rezultat calculat sunt semnificative.
Abordarea consecințelor acestor erori sunt subiecte în analiza numerică .
Multiplicare
Pentru a multiplica, semnificațiile sunt multiplicate, în timp ce exponenții sunt adăugați, iar rezultatul este rotunjit și normalizat.
e=3; s=4.734612 × e=5; s=5.417242 ----------------------- e=8; s=25.648538980104 (true product) e=8; s=25.64854 (after rounding) e=9; s=2.564854 (after normalization)
Împărțirea se face în mod similar, dar acest lucru este mai complicat.
Nu există probleme de anulare sau absorbție cu multiplicare sau divizare, deși se pot acumula mici erori pe măsură ce operațiile sunt efectuate în mod repetat. În practică, modul în care aceste operațiuni sunt efectuate în logica digitală poate fi destul de complex.
Vezi si
- Zecimal codat binar (BCD)
Referințe
Lecturi suplimentare
- Decimal Floating-Point: Algorism for Computers , Proceedings of the 16th IEEE Symposium on Computer Arithmetic ( Cowlishaw, Mike F. , 2003)