Reprezentгri binare ale numerelor reale
Transcript of Reprezentгri binare ale numerelor reale
Reprezentări binare ale numerelor reale
Aşa cum am mai spus, în calculator se face diferenţiere între numerele întregi şi numerele reale. In fapt, termenul de număr real este impropriu în acest context, deoarece spaţiul finit de reprezentare permite reprezentarea numai a unei submulţimi finite de numere raţionale . Reţinem deci că orice număr real se reprezintă în calculator aproximat printr-un număr raţional.
Pentru astfel de reprezentări există o constantă prestabilită n, care indică pe câţi biţi se realizează reprezentarea. De regulă, n este un multiplu de 8 (reprezentarea se face pe un număr întreg de octeţi). Frecvent, reprezentările se fac pe cuvânt sau pe dublucuvânt.
Reprezentarea semnului se face folosind bitul de semn. Bitul de semn are valoarea 0 pentru a indica un număr pozitiv şi valoarea 1, pentru a indica un număr negativ.
Sunt utilizate două tipuri de reprezentări binare ale numerelor reale:
- reprezentarea în virgulă fixă şi- reprezentarea în virgulă flotantă
Reprezentarea în virgulă fixă
Este o reprezentare naturală care pune în evidenţă semnul, partea întreagă şi partea fracţionară a numărului. Dimensiunile locaţiei de memorie în care se reprezintă un număr în virgulă fixă este prefixată: 8, 16, 32 sau 64 de biţi. Pentru a putea fi reprezentate, numerele sunt convertite (automat) în baza 2, aşa cum am văzut în §1.2.2.
În acest mod de reprezentare, bitul cel mai semnificativ este rezervat semnului (0 pentru + şi 1 pentru -). Urmează partea întreagă (mai exact cifrele părţii întregi ale valorii absolute a numărului) şi apoi partea fracţionară, ambele având dimensiuni (în biţi) prefixate. Pentru a se reprezenta un număr real, se consideră reprezentarea lui în baza 2. In locaţia de memorie sunt plasaţi biţii reprezentării, alinierea făcându-se la virgula virtuală. In cursul reprezentării sunt aplicate următoarele reguli:
- dacă partea întreagă a numărului are prea puţine cifre, se adaugă la stânga zerouri suplimentare;
- dacă partea întreagă are prea multe cifre, se pierd cifrele cele mai semnificative ce depăşesc spaţiul de reprezentare;
- dacă partea fracţionară are prea puţine cifre, se adaugă la dreapta zerouri nesemnificative;
- dacă partea fracţionară are prea multe cifre, se pierd cifrele cele mai nesemnificative care depăşesc spaţiul de reprezentare rezervat.
Poziţia virgulei este virtuală, fiind plasată după bitul 0 al părţii întregi şi înaintea bitului -1 al părţii fracţionare.
Să presupunem că reprezentarea se face într-o locaţie de 16 biţi, la care sunt rezervaţi 6 biţi pentru partea întreagă şi 9 biţi pentru partea fracţionară.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
S parte întreagă parte fracţionară virgulă virtuală
Să considerăm, spre exemplu, numărul (+10011,0101010101)2. El se va reprezenta în această locaţie adăugând un 0 la partea întreagă şi pierzând ultima zecimală (cea de-a 10-a). Bitul de semn va fi 0. Configuraţia obţinută o dăm mai jos atât în binar, cât şi în hexazecimal. (Cititorul trebuie să se obişnuiască să convertească rapid din baza 2 în baza 16, cum am arătat în §1.3.3, deoarece scrierea hexazecimală este mult mai la îndemână):
0010011010101010 = 26AA
In mod similar numărul (-10011,0101010101)2 se va reprezenta (se modifică doar bitul de semn):
1010011010101010 = A6AA
Numărul (+11110011,0101010101)2 se va reprezenta pierzându-se două cifre semnificative de la partea întreagă:
0110011010101010 = 66AA
Reprezentarea în virgulă fixă limitează gama numerelor reprezentabile astfel. Fie n este lungimea în biţi a locaţiei, I numărul de biţi rezervaţi pentru partea întreagă, iar F numărul de biţi rezervaţi pentru partea fracţionară. Rezultă că n = 1+I+F
Cu aceste notaţii, x 0 reprezentabil verifică relaţia: 2-F x 2I - 2-F
Dubla inegalitate este verificabilă imediat dacă punem în evidenţă cel mai mic şi cel mai mare număr.
Cel mai mic număr pozitiv reprezentabil este (0...0,0...01)2 având I zerouri la partea întreagă şi F-1 zerouri la partea fracţionară. Valoarea acestui număr este:
minim = 2-F
Cel mai mare număr pozitiv reprezentabil este (1...1,1...1)2 având I cifre 1 la partea întreagă şi F cifre 1 la partea fracţionară. Acest număr poate fi scris ca rezultat al diferenţei cu I+1 cifre la partea întreagă şi F cifre la partea fracţionară:
10...0,0...00 - 0,0...01-------------1...1,1...11
Dar descăzutul are valoarea 2I şi scăzătorul are valoarea 2-F, atunci cel mai mare număr are valoarea:
MAXIM = 2I-2-F
Reprezentarea în virgulă flotantă
Principalul dezavantaj al reprezentării în virgulă fixă este faptul că, dacă un număr nu mai încape în spaţiul de biţi rezervat, se pierd cifrele cele mai semnificative! Reprezentarea în virgulă flotantă este astfel concepută, încât, la depăşire, se pierd cifrele cel mai puţin semnificative!
Se ştie că orice număr real x se poate scrie astfel:
x = ±0,m be
unde:m - este mantisă numărului;b - este o bază de numeraţie;e - este un exponent.
Spre exemplificare, redăm următoarele egalităţi, cu b = 10. Se observă că un număr poate avea mai multe astfel de reprezentări.
(125,7323)10 = 0,1257323 103 = 0,00001257323 107
(0,0001257323)10 = 0,01257323 10-2 = 0,1257323 10-3
Plecând de la acest mod de scriere a numerelor, există diverse variante de reprezentare, pe care le vom defini în cele ce urmează.
DEFINITIA 3.4 Un număr real x se scrie cu mantisă subunitară şi exponent al unei baze b, dacă x = ±0,m be.
DEFINITIA 3.5 Un număr real x, x 0, este scrie cu mantisa subunitară normalizată, dacă x este scris cu mantisă subunitară şi exponent al bazei b şi dacă
are loc inegalitatea 1.
De exemplu, pentru b = 10, numerele 0,1257323 103 şi 0,1257323 10-3
sunt scrise normalizat.
Inmulţirea numerelor scrise cu mantisă subunitară provoacă frecvent apariţia mai multor cifre 0 imediat după virgulă. De aceea, se impune ca după aproape fiecare operaţie de înmulţire să se efectueze şi o operaţie de normalizare. In scopul reducerii normalizărilor, se mai foloseşte un mod de scriere oarecum diferit.
DEFINITIA 3.6 Un număr real x, x 0, este scris cu mantisa între 1 şi 2, dacă x se scrie în baza 2, astfel:
x = ±1,m 2e
Spre exemplu, au loc egalităţile:
(128,25)10 = (10000000,01)2 = (1,000000001)227
Se observă că mantisa se înmulţeşte cu o putere a lui 2 aparţine şi ea aparţine intervalului [1,2). La acest mod de scriere, se notează cu m partea fracţionară a mantisei.
DEFINITIA 3.7 Un număr real x este reprezentat în calculator în virgulă flotantă dacă pentru determinarea reprezentării se pleacă de la scrierea lui x cu mantisă subunitară sau cu mantisă între 1 şi 2.
Modul de scriere de la care se pleacă depinde de tipul calculatorului. Calculatoarele mai vechi (până la generaţia a III-a) folosesc scrierea cu mantisă subunitară. Calculatoarele actuale folosesc scrierea cu mantisă între 1 şi 2.
Indiferent de tipul calculatorului, mantisa se va reprezenta în baza 2. Pentru reprezentarea întregului număr este rezervat un număr standard de n
biţi. Semnificaţiile acestor biţi sunt:
s m t e 1 M 1 E
s de 1 bit reţine bitul de semn al mantisei;m reprezentată pe M biţi reţine cifrele mantisei dacă este vorba de mantisă
subunitară, sau partea de după virgulă a mantisei dacă este vorba de mantisă supraunitară;
t reţine bitul de semn al exponentului,;e având E biţi conţine cifrele exponentului.
Dacă n este dimensiunea locaţiei de reprezentare, avem n = 2+M+E. In cazul reprezentării cu mantisa între 1 şi 2, cifra 1 din stânga virgulei nu are bit rezervat! Calculatorul, ştiind că este vorba de această reprezentare, adaugă acest bit de valoare 1 numai în timpul calculelor.
Majoritatea calculatoarelor, din raţiuni tehnice, înlocuiesc bitul t de semn al exponentului, folosind în schimb reprezentări de forma:
s m c 1 M E
în care c este o mărime numită caracteristică. Valoarea ei se obţine adunând la exponentul e o constantă a reprezentării q, numită exces de exponent (deplasament, increment etc.). Deci:
c = e + q
Valorile posibile (numai numere întregi) ale lui e sunt:
0 e + q 2E - 1 -q e 2E -1 - q
Valoarea constantei q este o constantă constructivă a calculatorului. De obicei, ea are una dintre valorile:
Din modul de reprezentare rezultă că un număr real se reprezintă în virgulă flotantă aproximativ, având, în funcţie de tipul mantisei, maximum M sau M+1 cifre binare semnificative. De asemenea, ordinul de mărime este de asemenea limitat de numărul de biţi rezervaţi caracteristicii.
Să vedem acum care este cel mai mic număr pozitiv reprezentabil şi care este cel mai mare număr pozitiv reprezentabil. Cu notaţiile de mai sus, aceste valori sunt următoarele:
Cel mai mic strict pozitiv în convenţia reprezentării subunitare nenormalizate este:
minim = 0,0...01b-q = 2-M b-q
In convenţia reprezentării cu mantisa între 1 şi 2, el este:
minim = 1,0...012-q = (1 + 2-M) 2-q
Cel mai mare număr posibil de reprezentat în convenţia reprezentării subunitare este:
Cel mai mare număr posibil de reprezentat în convenţia reprezentării supraunitare este:
O ultimă precizare: nu toate numerele dintre "minim" şi "MAXIM" pot fi reprezentate. Toate numerele de acelaşi ordin şi care au aceleaşi prime M (M+1) cifre binare sunt identic reprezentate.
Procesoarele moderne adoptă convenţia supraunitară. In secţiunea următoare vom prezenta trei astfel de reprezentări.
Standarde de reprezentare în virgulă flotantă
Societaţea de Calculatoare IEEE [17] a fost cea care s-a preocupat şi a elaborat norme de reprezentare a numerelor în virgulă flotantă. Aceste norme sunt astăzi standarde "de facto". Practic toate firmele care fabrică astăzi calculatoare, ca şi toate case de software, şi-au însuşit aceste norme şi le-au implementat.
Pe lângă standardele IEEE, Casa de software Borland foloseşte la implementarea Turbo Pascal alte două moduri de reprezentare. Deoarece mediul Turbo Pascal este deosebit de răspândit, vom prezenta şi aceste moduri de reprezentare.
Aceste standarde folosesc scrierea numerelor cu mantisa între 1 şi 2.
In fig. 3.1 sunt redate structurile acestor standarde de reprezentare. Pentru fiecare tip de reprezentare, se dă mai întâi numele ei, iar în paranteză numărul de octeţi ocupaţi de reprezentare. Se indică apoi deplasamentul q folosit la caracteristică, deplasament care are una dintre valorile 127, 129, 1023, 16383. In sfârşit, se indică rangul primului şi al ultimului bit din fiecare zonă, precum şi numărul de biţi ocupaţi de fiecare zonă.
Standardele IEEE deosebesc cinci cazuri ce pot să apară la reprezentarea unui număr x şi le interpretează conform regulilor ce urmează:
a) DACA -q < e < q+1 ATUNCI x = (-1)s1,m2e SF_DACA
b) DACĂ e = -q şi m 0 ATUNCI x = (-1)s0,m2e SF_DACA
c) DACĂ e = -q şi m = 0 ATUNCI x = (-1)s0 SF_DACA
d) DACĂ e = q+1 şi m = 0 ATUNCI x = (-1)soo SF_DACA
e) DACĂ e = q+1 şi m 0 ATUNCI x NU EXISTA! SF_DACA
Semnificaţia lui ±oo depinde de calculator şi de limbajul care manipulează reprezentarea respectivă.
Convenţiile Turbo Pascal deosebesc trei cazuri ce pot să apară la reprezentarea unui număr x şi le interpretează conform regulilor ce urmează:
a) DACA -q < e < q+1 ATUNCI x = (-1)s1,m2e SF_DACA
b) DACĂ e = -q şi m = 0 ATUNCI x = 0 SF_DACA
c) DACA e = -q şi m 0 ATUNCI x NU EXISTA! SF_DACA
Să observăm faptul că EXTENDED Turbo Pascal memorează întreaga mantisă, inclusiv cifra 1 din stânga virgulei!
IEEE simplă precizie (4 octeţi): │ s│ c=e+127│ m │ └─┴─────┴─────────┘ 31 30 23 22 0 1 8 23 nr.biţi
IEEE dublă precizie (8 octeţi): │ s │ c=e+1023 │ m │
└─┴───────┴───────────┘ 63 62 52 51 0 1 11 52 nr.biţi
IEEE dublă precizie extinsă (12 octeţi): │ s │ c=e+16383 │ m │ └─┴────────┴───────────────┘ 95 94 80 79 0 1 15 80 nr.biţi
IEEE precizie cvadruplă (16 octeţi): │ s │ c=e+16383 │ m │ └─┴────────┴────────────────────┘ 127 126 112 111 0 1 15 112 nr.biţi
Turbo Pascal REAL (6 octeţi): │ s │ m │ c=e+129 │ └─┴───────────┴──────┘ 47 46 8 7 0 1 39 8 biţi
Turbo Pascal EXTENDED (10 octeţi): │ s │ c=e+16383 │ 1│ m │ └─┴────────┴─┴───────────────┘ 79 78 64 63 62 0 1 15 1 63 nr.biţi
Figura 3.1 Standarde de reprezentare în virgulă flotantă
Valorile aproximative pentru minim şi MAXIM depind în primul rând de numărul de biţi rezervaţi pentru caracteristică. Dacă se efectuează calculele în baza 10, se obţin valorile aproximative prezentate în continuare.
Pentru caracteristica reprezentată pe 8 biţi (IEEE simplă precizie şi REAL Turbo Pascal):
minim 10-38 MAXIM 1038
Pentru caracteristica reprezentată pe 11 biţi (IEEE dublă precizie):
minim 10-308 MAXIM 10308
Pentru caracteristica reprezentată pe 15 biţi (IEEE dublă precizie extinsă, IEEE precizie cvadruplă şi EXTENDED Turbo Pascal):
minim 10-4932 MAXIM 104932
Exemple. Mai întâi vom arăta cum se converteşte un număr real în virgulă flotantă. Să considerăm numărul:
(-3572,54)10
pe care intenţionăm s-ăl reprezentăm în formatul IEEE simplă precizie, IEEE dublă precizie şi REAL Turbo Pascal.
Mai întâi îl vom converti în baza 16, reţinând 14 cifre hexazecimale semnificative, care sunt suficiente pentru reprezentările pe care le avem în vedere, şi obţinem numărul:
(-DF4,8A3D708A3D7...)16
Acest număr îl trecem în baza 2 şi obţinem:
(-110111110100,10001010001111010111000010001010001111010111)2
Acum îl punem în forma normalizată, aşa cum am arătat mai sus, şi reţinem numai 52 de cifre după virgulă:
(-1,1011111010010001010001111010111000010001010001111010)2211
Din această formă vom prelua, începând cu bitul de după virgulă, atâţia biţi câţi sunt necesari pentru partea de mantisă a fiecărei reprezentări. Rescriem numărul rezultat în baza 16:
(-1,BE9147AE1147)16211
Semnul fiind "-", bitul de semn s va fi 1.Exponentul e = (11)10, valabil pentru toate cele trei reprezentări. Caracteristica c diferă la cele trei reprezentări:
- simplă precizie: c = e + 127 = (138)10 = (8A)16 = (10001010)2
- dubla precizie:
c = e + 1023 = (134)10 = (40A)16 = (10000001010)2
- TURBO Pascal: c = e + 129 = (140)10 = (8C)16 = (10001100)2
In sfârşit, colaţionând cele trei zone: semn, caracteristică şi mantisă, în locurile şi cu numărul de biţi specificaţi, obţinem cele trei reprezentări:
- simplă precizie: ┌─┬──────┬────────────────┐ │ 1│10001010│10111110100100010100011│ └─┴──────┴────────────────┘2
Grupăm acum în tetrade şi obţinem conţinutul hexazecimal al reprezentării în simplă precizie:┌───────┐ │ C55F48A3 │ └───────┘16
Procedând analog pentru dublă precizie, obţinem:┌┬─────────┬┬────────────────────────────────┐1100000010101011111010010001010001111010111000010001010001111010└┴─────────┴┴────────────────────────────────┘┌──────────────┐ │ C0ABE9147AE1147A │ └──────────────┘16
In sfârşit, pentru varianta TURBO Pascal, avem:
┌─┬────────────────────────────┬──────┐ │ 1│101111101001000101000111101011100001000│10001100 │ └─┴────────────────────────────┴──────┘2┌──────────┐ │ DF48A3D7088C│ └──────────┘16
În tabelul 3.4 sunt reprezentate numerele ±0 (pentru care există două reprezentări) ± 1, ±2, ±3, ±4 şi ±oo. In antetul celor şase coloane este indicat numărul total de octeţi şi numărul total de cifre hexazecimale ale reprezentării. Reprezentările sunt scrise în hexazecimal, dar pentru economie de spaţiu am înlocuit prin "..." un şir de cifre egale cu zero.
IEEE IEEE IEEE IEEE Turbo Turbo
n simpl.p. 4 oct. 8 c.h.
dubl.p. 8 oct. 16 c.h.
extins12 oct.24 c.h.
cvadrup.16 oct.32 c.h.
REAL 6 oct.12 c.h.
EXTEND.10 oct.20 c.h.
+0-0+1-1+2-2+3-3+4-4+-
0000...8000...3F80...BF80...4000...C000...4040...C040...4080...C080...7F80...FF80...
0000...8000...3FF0...BFF0...4000...C000...4008...C008...4010...C010...7FF0...FFF0...
00000...80000...3FFF8...BFFF8...40008...C0008...40008...C0008...40018...C0018...7FFF0...FFFF0...
00000...80000...3FFF0...BFFF0...40000...C0000...40004...C0004...40010...C0010...7FFF0...FFFF0...
00...0080...0000...8180...8100...8280...8240...82C0...8200...8380...83 - -
00000...80000...3FFF8...BFFF8...40008...C0008...4000C...C000C...40018...C0018... - -
Tabelul 3.4. Câteva numere reprezentate în virgulă flotantă
Operaţia inversă, adică obţinerea valorii zecimale dintr-o configuraţie care conţine o reprezentare în virgulă flotantă se face urmând calea inversă compunerii configuraţiei.
Pentru a nu mai repeta scrierile, să considerăm configuraţia hexazecimală pe patru octeţi (obţinută, mai sus, la conversia în simplă precizie):
┌───────┐ │ C55F48A3 │ └───────┘16
Presupunem că în ea se află un număr în virgulă flotantă, în simplă precizie. După trecerea în baza 2, prin desfacerea celor trei zone s, c şi m se obţine
numărul:
(-1BE9146)16 211 =
(-1BE9146)16 16-6 211 =
(-1BE9146)16 2-13 =
(-29266246)10 / (8192)10 =
(-3572,5397949...)10
Se observă că numărul obţinut este trunchiat cu 0,003... faţă de numărul iniţial. Aceasta datorită numărului relativ mic de cifre semnificative al reprezentării în simplă precizie.