Documente Academic
Documente Profesional
Documente Cultură
Baze de Numerarie - Reprezentarea Numerelor - Laborator2
Baze de Numerarie - Reprezentarea Numerelor - Laborator2
Sisteme de numeraie
F.Boian, Bazele matematice ale calculatoarelor, UBB Cluj-Napoca, 2002
Sistem de numeraie
sistem aditiv
Cifre:
I V
X
L
C
D
M
1 5
10
50
100
500
1000
Reguli:
a) mai multe cifre de aceeai valoare, scrise consecutiv, reprezint suma acestor cifre:
XX=20
MMM=3000
b) o pereche de cifre diferite, cu cifra mai mare aflat n faa cifrei mai mici, reprezint
suma acestor cifre:
XIII=10+3=13
VII=5+2=7
DX=500+10=510
c) o pereche de cifre diferite, cu cifra mai mic n faa cifrei mai mari, reprezint diferena
acestor cifre:
IV=5-1=4
IX=10-1=9
IL=50-1=49
d) pentru scrierea unor numere mai mari se folosete o bar orizontal deasupra
simbolurilor, bar care indic nmulirea valorii corespunztoare simbolului cu 1000
V =5000
Dezavantaje:
scriere greoaie
reprezentri multiple ale numerelor (ex: 490=CDXC=XD)
numere lungi
operaii lente
nu exist simbol pentru valoarea zero
Exemple
1989=MCMLXXXIX
2010=M M X
Palatul Josika (Casa cu picioare) este nlat pe locul fostei reedine clujene a principilor Transilvaniei.
Cldirea a devenit reedina lui Anton Josika, comite al Clujului, la mijlocul secolului al XVIII-lea. Cldirea n
stil neoclasicist a cptat nfiarea de astzi n anul 1828, cnd a fost refcut de Josika Janos,
guvernator al Transilvaniei.
Elementul caracteristic n faad este porticul sobru cu coloanele dorice. Atica poart inscripia
MDCCCXXVIII (1828), anul renovrii cldirii.
1
Curs 2
- sistem poziional
Aportul unei cifre n stabilirea valorii unui numr depinde de valoarea cifrei i de poziia
ocupat n irul de cifre folosit.
Regul:
a) Fiecare grup de 10 elemente (uniti, zeci, sute, etc.) formeaz o grup de rang
superior (zece, sut, mie, etc.)
Sistemul de numeraie cu baza 10 (zecimal)
Cifre: 0
1
2
3
4
5
Sistemul de numeraie octal - baza 8
cifre: 0
1
2
3
4
5
Sistemul de numeraie binar - baza 2
cifre: 0
1
Sistemul de numeraie hexazecimal - baza 16
cifre: 0
1
2
3
4
5
B(=11)
C(=12)
D(=13)
6
7
E(=14)
8
9
F(=15)
(=10)
Exemple:
Numrul ( xyz )b = zb0 + yb1 + xb2
(271)10 = 1+710+2100
(1101)2=120+02+122+123=13
(A3C)16=12160+316+10162=2620
Pentru transformarea unui numr dintr-o baz oarecare b n baza 10 se nmulete ultima cifr a
numrului cu baza la puterea 0, penultima cifr se nmulete cu baza la puterea a 1-a,
antepenultima cu baza la puterea a 2-a, etc. i se adun rezultatele acestor nmuliri.
Pentru a face astfel de transformri trebuie cunoscute cifrele numrului care se transform. Mai
jos este dat ca exemplu un program care determin numrul de cifre ale unui numr natural n
baza 10 i valorile cifrelor acestui numr.
Cifrele numrului sunt resturile mpririi ntregi a numrului la baza sistemului de numeraie n
care este scris. Dup fiecare mprire, noul numr care se mparte este ctul mpririi
precedente. Impririle continu pn cnd ctul devine 0.
Curs 2
Pentru determinarea cifrelor zecimale unui numr real se procedeaz n felul urmtor:
Fie nr numrul real dat.
1. se determin prima cifr zecimal a numrului ca i
cif=[10*(nr-floor(nr))] //floor returneaza cel mai mare ntreg <= nr
2. nr=nr*10
3. dac nrfloor(nr) continu la 1
4. stop
Program exemplu: determinarea numrului de cifre zecimale ale unui numr real
//Determina numarul de cifre zecimale ale unui numar real
//si construieste un sir cu aceste cifre
#include
#include
#include
#include
<iostream.h>
<stdio.h>
<math.h>
<conio.h>
void main()
{
double nr;
long int j,N,sir[100],cif;
printf("\nProgramul determina numarul de cifre zecimale ale unui numar real\n");
printf("si construieste un sir avand ca elemente cifrele zecimale ale numarului
dat\n");
do
{
printf("\nIntroduceti un numar real:\t");
//
fflush(stdin);
}
while(scanf("%lf",&nr)!=1);
j=0; // contor pentru sirul care va contine cifrele zecimale ale numarului real
3
Curs 2
while(nr!=floorl(nr))
//sau while((nr-floorl(nr))>1e-6)
{
//determina cifra actuala
cif=(long int) (10*(nr-floorl(nr)));
sir[j]=cif;
nr=nr*10.0;
j++;
}
N=j;
printf("\nNumarul are %d cifre zecimale, iar sirul format din cifrele sale
este:\n",N);
for(j=0;j<N;j++)
cout<< sir[j];
getch();
}
(24)10 = (11000)2
(256)10 = (400)8
(2653)10 = (A5D)16
Pentru transformarea unui numr natural din baza 10 ntr-o baz oarecare b se mparte numrul
respectiv la baz, obinndu-se un ct i un rest mai mic dect b. Apoi se mparte ctul obinut la b
obinndu-se un nou ct i un nou rest mai mic dect b. mprirea continu pn cnd se obine
ctul 0. Cifrele numrului n baza b sunt resturile mpririlor, citite de la ultimul rest ctre primul.
Program exemplu: tiprirea unui numr natural n baza 10 introdus de la tastatur, n bazele 10, 8
i 16, folosind specificatorii de tip %d, %o i %x
//Tipareste un numar natural introdus de la tastatura
//in bazele 10, 8 si 16
#include <iostream.h>
#include <stdio.h>
void main()
{
int n;
cout << "Introduceti un nr. natural n (in baza 10) :
cin >> n;
cout << "Baza 10: " << n;
printf("\nBaza 8: %o", n);
printf("\nBaza 16: %X", n);
";
Curs 2
void main()
{
int c,r,nr,i,j,bin[100];
printf("\nProgramul face transformarea in binar a unui numar natural\n");
printf("\nNumarul trebuie sa fie <=32767 (de tip int)\n\n\a");
do
{
printf("\nIntroduceti un nr pozitiv:
");
scanf("%d",&nr);
}
while(nr<0);
j=0;
do
{
c=nr/2;
r=nr-c*2;
bin[j]=r;
j++;
nr=c;
}
while(nr>0);
printf("\nNumarul transformat in binar este:\t");
for(i=j-1;i>=0;i--)
printf("%d",bin[i]);
}
Exemplu:
Fie numrul 0.369140625 n baza 10 care va fi convertit n baza 8. Vom nmuli mereu prile
fracionare cu 8
Curs 2
Verificare:
2 7
5 128+56+5 189
(0.275)8 = + 2 + 3 =
=
= 0.369140625
8 8
8
512
512
3 2 5 192+16+5 213
(0.325)8 = + 2 + 3 =
=
= 0.416015625 0.416382
8 8
8
512
512
adic am obinut o eroare de trunchiere. Astfel de erori apar frecvent n cazul conversiilor duble,
atunci cnd se reine un numr prestabilit de cifre semnificative.
Tem: Transformai numrul 0.3741 n baza 2, reinnd primele 6 cifre binare apoi facei
transformarea invers. Care este diferena dintre numrul iniial i cel obinut prin transformarea
invers?
Algoritm pentru conversia prii fracionare dintr-o baz p n alt baz q, prin metoda nmulirilor
succesive:
Fie f partea fracionar. Dup obinerea cifrei de rang -1 cu relaia c-1=[qf] ( [ ] semnific partea
ntreag) n baza b se efectueaz din nou nmulirea nlocuind pe f cu qf, etc.
1. citete f n baza p
2. i=0;
3. dac f=0 sau s-au obinut suficiente cifre continu la pasul 8
4. ci=int(fq) // partea ntreag a lui fq
5. f=partea fractionar a lui fq adic f = fq-[fq]
6. i++
7. continu la pasul 3
8. n=i
9. scrie ci, i=0, 1, ..., n-1
10. stop
Program exemplu: Conversia prii fracionare a unui numr scris n baza 10 ntr-o baz oarecare q
//Programul converteste partea fractionara a unui numar scris in baza 10
//intr-o alta baza q. Numarul se va introduce sub forma 0.xxxxxxx...
#include <iostream.h>
#include <stdio.h>
#include <math.h>
void main()
{
double f;
int i,n, c[20],q,nmax=15,cond;
cout << "Introduceti partea fractionara a numarului, sub forma: 0.xxxxxxx...:
";
cin >> f;
6
Curs 2
Reprezentarea numerelor
Reprezentarea numerelor ntregi cu semn n complement fa de 2
Definiii
pe opt bii:
(111)2 = 7=23-1
1
(1111111)2 = 127=27-1
Curs 2
Aadar, n acest cod, dac X este pozitiv se reprezint ca atare pe n-1 bii, iar dac este
negativ, se reprezint valoarea 2n-|X|.
Exemplu:
sau acelai lucru, se scade n zecimal +18 din 2n (din 28) i se reprezint rezultatul scderii n
binar:
28-18=256-18=238
(238)10=(11101110)2
O metod mai rapid de deducere a reprezentrii numerelor ntregi negative n complement
fa de 2 pe n bii rezult din discuia precedent i este dat de urmtoarea regul:
Curs 2
Exemple:
Fie n = 4 bii
Pentru X=6 reprezentarea n binar pe 4 bii va fi: 0110
Pentru X=-6, reprezentarea n binar va fi cea a numrului pozitiv 24-6=10 i care n binar este
1010. Aceeai reprezentare se obine pornind de la reprezentarea lui +6 i folosind regula de
mai sus.
Alte coduri de reprezentare a valorilor ntregi sunt:
1. Codul direct
Bitul de rang n-1 (cel mai din stnga) este rezervat pentru semn. Un numr negativ se
reprezint n cod direct reprezentnd modulul su dup care bitul de semn ia valoarea 1.
2. Codul invers
Bitul de rang n-1 (cel mai din stnga) este rezervat pentru semn. Un numr negativ se
reprezint n cod invers reprezentnd modulul su dup care se inverseaz valorile tuturor
biilor reprezentrii.
Calculatoarele actuale folosesc codul complementar pentru reprezentarea ntregilor. Avantajul
acestui cod const n faptul c circuitele electronice pentru adunare i scdere nu trebuie s
examineze semnul numrului (vor efectua ntotdeauna adunri). n plus, n acest cod, valoarea 0
(zero) are reprezentare unic.
Reprezentarea numerelor reale
Reprezentarea numerelor reale se poate face n virgul fix sau n virgul mobil.
Pentru reprezentarea numerelor reale n virgul fix se folosete bitul cel mai semnificativ ca
bit de semn. Modulul prii ntregi i partea fracionar au un numr prefixat de bii pe care se
reprezint i se aplic urmtoarele reguli:
alinierea n locaia de memorie se face la virgula virtual.
dac valoarea prii ntregi este mai mic dect valoarea maxim ce poate fi reprezentat
pe biii alocai prii ntregi se adaug la stnga zerouri suplimentare.
dac valoarea prii ntregi este mai mare dect valoarea maxim ce poate fi reprezentat
pe biii alocai prii ntregi se pierd cifrele cele mai semnificative.
dac valoarea prii fracionare este mai mic dect valoarea maxim ce poate fi
reprezentat pe biii alocai prii fracionare se adaug la dreapta zerouri nesemnificative.
dac valoarea prii fracionare este mai mare dect valoarea maxim ce poate fi
reprezentat pe biii alocai prii fracionare se pierd cifrele cele mai nesemnificative.
Exemplu
S presupunem c se folosesc 2 octei (16 bii) pentru reprezentarea numerelor reale, din care
bitul de rang 15 va fi folosit pentru semn, 6 bii vor fi folosii pentru reprezentarea prii ntregi i 9
bii pentru reprezentarea prii fracionare.
Curs 2
x 0.m be
unde m este mantisa numrului, b este baza de numeraie, iar e este exponentul.
In notaia tiinific, numerele reale se noteaz sub forma:
Exemple:
Valoare real
125,7323
-10,375
-0,00642
mantisa baza
exponent
Notaie tiinific
1.257323102
-1.0375101
-6.4210-3
Scrierea valorilor reale sub forma x 0.m be este o scriere cu mantis subunitar, n baza 10.
Orice valoare real poate fi scris ns i sub forma:
x 1.m 2e
care nseamn scrierea numrului n baza 2, cu mantis ntre 1 i 2, m fiind partea fracionar a
mantisei.
Valorile date mai sus ca exemplu se scriu n baza 2 sub urmtoarea form:
Zecimal
125,7323
-10,375
-0,00642
Binar
1111101.101110110111
1010.011
0.00000001101001001
Semn
+
-
Zecimal
125,7323
-10,375
-0,00642
Astfel, din exemplele de mai sus rezult c pentru reprezentarea valorilor reale n virgul flotant
trebuie folosit un anumit numr de bii, care s permit reprezentarea:
- semnului numrului
- mantisei
- exponentului
- semnului exponentului
Pentru aceasta, se folosete standardul IEEE (Institute of Electrical and Electronics Engineers),
pentru reprezentarea numerelor n simpl precizie (pe 32 bii) sau n dubl precizie (pe 64 bii).
10
Curs 2
Bitul de semn:
- 0 corespunde unui numr pozitiv i 1 corespunde unui numr negativ
Exponentul
Pe numrul de bii rezervai pentru exponent trebuie reprezentate att numere pozitive ct i
negative. n acest scop, exponentului propriu-zis al numrului care se reprezint i se adaug o
anumit valoarea care depinde de tipul de precizie folosit (simpl sau dubl), numit
caracteristic. n standardul IEEE simpl precizie aceasta are valoarea de 127 (27-1) i n dubl
precizie are valoarea 1023 (210-1). Astfel, pentru un numr al crui exponent este 0, pe biii alocai
exponentului se stocheaz valoarea 127 (n binar 01111111).
O valoare de 200 (n binar 11001000) stocat pe biii exponentului nseamn de fapt exponentul
200-127=73.
Exponenii cu toi biii 0 sau toi biii 1 sunt rezervai pentru numere speciale.
Pentru standardul dubl precizie se aloc 11 bii pentru exponent, iar caracteristica este 1023.
Mantisa
Mantisa reprezint biii de precizie ai unui numr. Aceasta este compus dintr-un bit implicit
principal (ntotdeauna 1 n scrierea cu mantis ntre 1 i 2) i biii fraciei.
Pentru a afla bitul implicit principal se ine cont de faptul c n notaia tiinific orice numr poate
fi reprezentat n mai multe feluri. Astfel, numrul 5 poate fi reprezentat ntr-unul din modurile
urmtoare:
5.00100
0.05102
500010-3
n scopul maximizrii cantitii de numere reprezentabile, numerele floating point sunt stocate n
form normalizat, form care se obine punnd punctul zecimal dup prima cifr nenul. n form
normalizat, numrul 5 este reprezentat sub forma: 5100. In baza 2, singura cifr nenul nu poate
fi alta dect cifra 1, astfel nct nu este necesar ca ea s fie reprezentat explicit i n simpl
precizie de exemplu, toi cei 23 de bii sunt folosii pentru reprezentarea prii fracionare a
mantisei, obinndu-se practic o precizie de 24 bii folosind doar 23 de bii.
In zecimal, precizia corespunztoare obinut este:
24
= 7.2 adic de 7 cifre n simpl precizie i
log210
52
=15.65 adic 15 cifre n dubl precizie.
log210
Astfel, n simpl precizie, cei 32 bii alocai reprezentrii unui numr n virgul flotant sunt:
- 1 bit pentru semnul mantisei (bitul de rang 31)
- 8 bii pentru exponent (care va include i semnul exponentului, biii de rang 23-30)
- 23 de bii pentru mantis (biii de rang 0-22)
n cazul reprezentrii cu mantis ntre 1 i 2, cifra 1 din stnga virgulei nu are bit rezervat, cifra
adugndu-se numai n timpul calculelor.
11
Curs 2
Fracie
Caracteristic
Simpl precizie
1 [31]
23 [22-00]
127
Dubl precizie
1023
Dac 0<E<255 atunci V=(-1)S*2E-127*1.F unde "1.F" reprezint numrul binar creat prin
adugarea la partea fracionar a prii ntregi 1.
Dac E=255 (toi biii exponentului sun setai pe valoarea 1) i F este nenul, atunci V=NaN
("Not a number")
Dac E=255 (toi biii exponentului sun setai pe valoarea 1), F este nul i S =1, atunci V=
Dac E=255 (toi biii exponentului sun setai pe valoarea 1), F este nul i S = 0, atunci
V=+
Dac E=0 (toi biii exponentului sunt 0), F este zero (toi biii prii fracionare sunt 0) i S
=1, atunci V=-0
Dac E=0 (toi biii exponentului sunt 0), F este zero (toi biii prii fracionare sunt 0) i S
=0, atunci V=+0
Aadar, ca reguli sunt stabilite reprezentrile pentru valoarea zero, precum i pentru valorile i
respectiv pentru "valorile NaN.
In figura de mai jos sunt date cteva valori reprezentate n virgul flotant n standardul IEEE
simpl precizie.
Exemplu de valori reprezentate n simpl precizie
bitul de
semn
exponentul
E=e+c
1 bit
8 bii
23 bii
7/4
01111111
11000000000000000000000
-34.432175
10000100
00010011011101010001100
-959818
10010010
11010100101010010100000
+0
00000000
00000000000000000000000
-0
00000000
00000000000000000000000
00000000
00000000000000000000001
11111110
11111111111111111111111
infinit
11111111
00000000000000000000000
NaN
11111111
Valoare n zecimal
12
Curs 2
Simpl precizie
Cel mai mic nr. pozitiv
-126
Dubl precizie
-38
sau 1.175 x 10
-1022
Cel mai mare nr. pozitiv (2- 2-23) 2127 sau 3.403 x 1038 (2- 2-52) 21023 sau 1.798 x 10308
Valoarea a mainii
Precizia zecimal
Cel mai mic numr real pozitiv care poate fi reprezentat n simpl precizie are reprezentarea:
00000000100000000000000000000000
care nseamn: 1.0 * 2e.
Partea fracionar este zero deoarece toi cei 23 de bii folosii pentru reprezentarea acesteia sunt
setai pe zero. La partea fracionar se adaug partea ntreag corespunztoare bitului "ascuns" 1
(care nu se reprezint n acest format simpl i dubl precizie).
Valoarea exponentului e se deduce innd cont c pe biii exponentului este reprezentat valoarea
e+127. Cum E este (00000001)2 = 110, rezult e=-126. Aadar, valoarea celei mai mici valori reale
care poate fi reprezentat este:
1.0*2-126=1.17549435110-38
Analog se deduce uor valoarea celui mai mare numr real care poate fi reprezentat n simpl
precizie, aceasta avnd reprezentarea binar:
01111111011111111111111111111111
Atenie, nu putem folosi toi biii exponentului setai pe 1 deoarece acest caz este utilizat pentru
reprezentarea valorilor speciale i Nan.
Din reprezentarea de mai sus rezult c E=28-1 -1=28-2, adic e=28-2-127=28-2-27-1 = 2(27-1)-271=27-1=127.
A, aceast valoare va fi: (1.11111111111111111111111)22127.
Valoarea prii fracionare este: 2-1+2-2++2-23 =
=2-1 (2-23-1)/(2-1-1)=1-2-23
Aadar, cel mai mare numr pozitiv reprezentabil este:
(1+1-2-23*2127 = 3.402823467 1038
Precizia reprezentrii numerelor este dat de urmtoarele exemple:
Valoarea 1.0 se reprezint:
00111111100000000000000000000000
Urmtoarea valoare reprezentabil, imediat mai mare ca 1.0 va avea reprezentarea:
00111111100000000000000000000001
Diferena dintre aceste valori este dat de prezena pe poziia cel mai puin semnificativ din biii
mantisei, a bitului 1. Poziia i valoarea acestui bit nseamn n zecimal valoarea 0.0000001192.
Aceast valoarea d precizia acestei reprezentri. Aadar, n acest format, numerele reale nu sunt
reprezentate continuu ci discret, cu un pas de 1.119210-7.
Valoarea "Not A Number"
Valoarea NaN este folosit pentru a reprezenta valori care nu reprezint un numr real. Aceste
valori NaN sunt reprezentate printr-o succesiune de bii cu exponentul avnd toi biii 1 i o fracie
nenul.
13
Curs 2
Exist dou feluri de valori Nan: QNaN (Quiet NaN) i SNaN (Signalling NaN).
QNaN este un NaN cu cei mai semnificativi bii ai fraciei setai i rezult din operaii aritmetice
cnd rezultatul matematic nu este definit.
SNaN este un NaN cu cei mai semnificativi bii a fraciei teri i astfel de valori sunt folosite pentru
a semnala excepii. Semantic, QNaN semnific operaie nedeterminat, iar SnaN semnific operaie
invalid.
Exemplu:
Observaie: Numrul real 18.0 nu are reprezentare identic cu cea a numrului ntreg 18.
14