Reprezentгri binare ale numerelor reale

18
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.

Transcript of Reprezentгri binare ale numerelor reale

Page 1: 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;

Page 2: Reprezentгri binare ale numerelor reale

- 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.

Page 3: Reprezentгri binare ale numerelor reale

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

Page 4: Reprezentгri binare ale numerelor reale

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:

Page 5: Reprezentгri binare ale numerelor reale

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.

Page 6: Reprezentгri binare ale numerelor reale

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.

Page 7: Reprezentгri binare ale numerelor reale

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 │

Page 8: Reprezentгri binare ale numerelor reale

└─┴───────┴───────────┘ 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

Page 9: Reprezentгri binare ale numerelor reale

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:

Page 10: Reprezentгri binare ale numerelor reale

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

Page 11: Reprezentгri binare ale numerelor reale

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

Page 12: Reprezentгri binare ale numerelor reale

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.