Sunteți pe pagina 1din 12

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ă
1
are loc inegalitatea  _m_ <1 1.
b
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)227

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:

E -1
E
 2 - 1  2 + 1 
E
q = 2 sau q =   sau q =  
2 2
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...01b-q = 2-M  b-q

In convenţia reprezentării cu mantisa între 1 şi 2, el este:

minim = 1,0...012-q = (1 + 2-M)  2-q

Cel mai mare număr posibil de reprezentat în convenţia reprezentării subunitare


este:

0,1 ... 1  b2 = ( 1 - 2-M )  b2


E -1- q E - 1- q
MAXIM =

Cel mai mare număr posibil de reprezentat în convenţia reprezentării supraunitare


este:

= 1,1 ... 1  22 = ( 2 - 2-M )  22


E -1- q E -1- q
MAXIM

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)s1,m2e SF_DACA

b) DACĂ e = -q şi m  0 ATUNCI x = (-1)s0,m2e SF_DACA

c) DACĂ e = -q şi m = 0 ATUNCI x = (-1)s0 SF_DACA

d) DACĂ e = q+1 şi m = 0 ATUNCI x = (-1)soo 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)s1,m2e 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 87 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)2211

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)16211

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. dubl.p. extins cvadrup. REAL EXTEND.
4 oct. 8 oct. 16 c.h. 12 oct. 16 oct. 6 oct. 10 oct.
8 c.h. 24 c.h. 32 c.h. 12 c.h. 20 c.h.
+0 0000... 0000... 00000... 00000... 00...00 00000...
-0 8000... 8000... 80000... 80000... 80...00 80000...
+1 3F80... 3FF0... 3FFF8... 3FFF0... 00...81 3FFF8...
-1 BF80... BFF0... BFFF8... BFFF0... 80...81 BFFF8...
+2 4000... 4000... 40008... 40000... 00...82 40008...
-2 C000... C000... C0008... C0000... 80...82 C0008...
+3 4040... 4008... 40008... 40004... 40...82 4000C...
-3 C040... C008... C0008... C0004... C0...82 C000C...
+4 4080... 4010... 40018... 40010... 00...83 40018...
-4 C080... C010... C0018... C0010... 80...83 C0018...
+ 7F80... 7FF0... 7FFF0... 7FFF0... - -
- FF80... FFF0... FFFF0... FFFF0... - -
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.

S-ar putea să vă placă și