Documente Academic
Documente Profesional
Documente Cultură
Virgula Mobila PDF
Virgula Mobila PDF
Una dintre cele mai răspândite reprezentări internă (în PC-uri) a numerelor
reale este reprezentarea în virgulă mobilă. Reprezentarea în virgulă mobilă
presupune existenţa unei baze b (întotdeauna presupusă pară) şi a unei precizii p.
Un număr în virgulă mobilă este un număr de forma
α1 α 2 α p −1
±(α0 + + 2 +…+ p −1 )bE, αk ∈ {0, 1, ...b-1} pentru orice k = 0, p − 1 , E ∈Z.
b b b
Mai precis, denumirea de număr în virgulă mobilă va fi utilizată pentru numerele
reale care se reprezintă exact sub forma de mai sus. În această reprezentare α0, α1,
…, αp-1 se numesc cifre semnificative. Fiecărei reprezentări în virgulă mobilă i se
asociază două numere întregi, Emin şi Emax, ce reprezintă valorile limită permise
pentru exponentul E (Emin ≤ E ≤ Emax). Tabelul de mai jos exemplifică cei patru
parametri (baza, precizia, valorile limită ale exponentului) ce caracterizează
reprezentarea în virgulă mobilă în diverse sisteme
1
Mădălina Roxana Buneci Metode Numerice – Curs - 2007
2
Metode Numerice – Curs 4
epsilon maşină), notată εmach. Precizia a maşinii este definită ca cel mai mic număr
pozitiv ε cu proprietatea că
fl(1.+ ε) > 1.
Dacă regula de rotunjire este trunchierea atunci
εmach = b1 - p,
iar dacă regula de rotunjire este rotunjirea la par atunci
1 1- p
εmach = b .
2
Eroarea relativă maximă cu care fl(x) aproximează x este dată de
fl(x ) − x
≤ εmach.
x
Deşi amândouă sunt "mici", precizia maşinii (εmach) şi cel mai mic număr pozitiv
normalizat UFL (în reprezentare în virgulă mobilă fixată) nu trebuie confundate. De
obicei Emin < -p şi deci între ele există relaţia
0 < UFL < εmach < OFL.
Fie x un număr real aproximat de
α1 α 2 α p −1
fl(x) =±(α0 + + 2 +…+ p −1 )bE.
b b b
Exponentul E poate lua atât valori pozitive cât şi valori negative. Cel mai adesea
exponentul este “decalat “ şi reprezentat ca un număr întreg pozitiv (fără semn).
Aceasta deoarece ordinea lexicografică (stabilită între şirurile de cifre din
reprezentare) şi ordinea naturală sunt compatibile în cazul numerelor întregi fără
semn. În consecinţă, compararea exponenţilor (şi a numerelor reale
corespunzătoare) poate fi făcută eficient. Astfel reprezentarea internă a unui număr
α1 α 2 α p −1
real x aproximat prin fl(x) = ± (α0 + + 2 +…+ p −1 )bE se face sub forma
b b b
s ed α0α1…αp-1
3
Mădălina Roxana Buneci Metode Numerice – Curs - 2007
unde s este semnul lui x (se completează cu 0 dacă semnul este + şi cu 1 dacă
semnul este -) iar ed este exponentul obţinut prin adunarea unui decalaj D la
exponentul E:
ed = E + D.
4
Metode Numerice – Curs 4
α1 α 2 α p −1
Un număr în virgulă mobilă ±(α0 + + 2 +…+ p −1 )2E se reprezintă intern
2 2 2
conform IEEE-754 sub forma
s ed α1…αp-1
5
Mădălina Roxana Buneci Metode Numerice – Curs - 2007
s e7e6e5e4e3e2e1e0 α1 α2 α23
α1 α 2 α 23
Fie ed = e0 + e12 + e222 + … + e727 şi m = + 2 +…+ 23 . Valoarea v
2 2 2
reprezentată se determină după cum urmează:
▹ dacă 0 < ed < 255, atunci v = (-1)s⋅(1 + m)⋅2ed - 127.
α1 α 2 α 52
Fie ed = e0 + e12 + e222 + … + e10210 şi m = + 2 +…+ 52 . Valoarea v
2 2 2
reprezentată se determină după cum urmează:
▹ dacă 0 < ed < 2047, atunci v = (-1)s⋅(1 + m)⋅2ed - 1023.
6
Metode Numerice – Curs 4
x = 11100100,00100110011001…
Forma normalizată:
x = 0,111001000010011001…⋅ 28 = 1,11001000010011001…⋅ 27
ed = 7 + 28-1 - 1 = 135, ed2 = 100001102
m = 11001000010011001100110 [011]
(am omis primul bit =1, iar cei trei biţi din paranteză sunt utilizaţi pentru rotunjire la
par)
fl(x) = 1, 11001000010011001100110⋅ 28
Reprezentare în virgulă mobilă, simplă precizie, (cu bit ascuns) pentru 228,15:
7
Mădălina Roxana Buneci Metode Numerice – Curs - 2007
11000001110110100000000000000000
C 1 D A 0 0 0 0
Deci reprezentării cu bit ascuns a lui -27,25 îi corespunde C1DA0000 în
hexazecimal.
x = 0,1
0,1 ⋅ 2 = 0,2
0,2 ⋅ 2 = 0,4
0,4 ⋅ 2 = 0,8
0,8 ⋅ 2 = 1,6 = 1 + 0,6
0,6 ⋅ 2 = 1,2 = 1 + 0,2
0,2 ⋅2 = 0,4
0,110 = 0, 00011001100110011…
x = 0, 110011001100…⋅2-3 = 1,10011001100110011001100 110…⋅2-4
fl(x) =1, 10011001100110011001101 ⋅ 2-4
(după cei 23 de biţi ai mantisei urmează 110, şi deci rotunjirea se face prin
adăugarea unei unităţi).
ed = - 4 + 28-1 -1 = 123 = 26 + 25 + 24 + 23 + 2 + 1 , ed2 = 11110112
Reprezentare în virgulă mobilă, simplă precizie (cu bit ascuns) pentru 0,1:
0 0 1 1 11 0 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1
3 D C C C C C D
8
Metode Numerice – Curs 4
0 0 1 1 11 1 1 1 0 0 1 1 0 01 1 0 01 1 0 01 1 0 01 1 0 1 0
3 F 9 9 9 9 9 A
Deci reprezentării cu bit ascuns a lui 1,2 îi corespunde 3F99999A în hexazecimal.
#include <stdio.h>
#include <conio.h>
void main(){
long int *i;
float f1=228.15,f2=-27.25, f3=0.1, f4=1.2;
clrscr();
i=(long int*) &f1;
printf("\nNumar in virgula mobila:%f\n\tFormat intern %08lX
(hexazecimal)",f1,*i);
i=(long int*) &f2;
printf("\nNumar in virgula mobila:%f\n\tFormat intern %08lX
(hexazecimal)",f2,*i);
9
Mădălina Roxana Buneci Metode Numerice – Curs - 2007
Programul afişează
10
Metode Numerice – Curs 4
real foarte mic poate fi în mod rezonabil aproximat cu zero. Pe multe sisteme de
calcul depăşirea superioară de capacitate este fatală, în timp ce în caz de depăşire
inferioară de capacitate, numărul respectiv este asociat cu zero.
Anumite legi ale aritmeticii reale nu sunt valabile într-un sistem în virgulă
mobilă. Astfel adunarea şi înmulţirea în virgulă mobilă sunt comutative, dar nu
asociative. De exemplu, dacă ε este un număr pozitiv mai mic decât εmach, dar mai
mare decât εmach/2, atunci
(1 + ε) + ε = 1, iar 1 + (ε + ε) > 1.
Rezultatul unei operaţii în virgulă mobilă poate să fie semnificativ diferit
faţă de rezultatul aceleaşi operaţii în aritmetica exactă. Să considerăm numărul real
1
x = . Se reprezintă în baza 2, prin x = 0,0001100110011…=1,
10
10011001100110011001101…2-4. În simplă precizie este aproximat de fl(x) = 1,
10011001100110011001101⋅2-4, ceea ce introduce o eroarea de
0.000000000000000000000000011001100 în binar sau aproximativ 0.000000047 în
zecimal. Programul în C de mai jos pune în evidenţă cum se propagă această eroare
prin înmulţire:
#include <stdio.h>
#include <conio.h>
void main(){
float f=1./10,z=10;
int i;
clrscr();
for(i=1;i<33;i*=2){
printf("\n0.1*10^%d-10^%d = %f ",i+1,i,f*(z*10)-z);
z=z*z;
}
getch();
}
Programul afişează
0.1*10^2 - 10^1 = 0.000000
0.1*10^3 - 10^2 = 0.000001
0.1*10^5 - 10^4 = 0.000149
11
Mădălina Roxana Buneci Metode Numerice – Curs - 2007
dacă fl(x) este egal (sau foarte apropiat de) fl(y). În următorul program (în C)
aproximăm sin(x) printr-o sumă parţială a seriei
∞
(− 1)n
∑ (2n + 1)! x 2 n +1
n =0
#include<stdio.h>
#include<conio.h>
#include<math.h>
void main(){
float x,s,t,eps,x2;
int i,n;
clrscr();
printf("x=");scanf("%f",&x);
printf("Eroarea=");scanf("%f",&eps);
t=x;s=0;i=1; x2=x*x;
while (fabs(t)>=eps){
s+=t;printf("\n%f",s);
t=-t*(x2/(4*i*i+2*i));
i++;
}
printf("\nsin(%f) = %f",x,s);
printf("\nsin(%f) = %f" ,x,sin(x));
12
Metode Numerice – Curs 4
getch();
}
Pentru x=2 şi eroare 10-7 se obţine aproximaţia 0.909297 corectă a lui sin(2).
Pentru x = 40 şi eroare 10-7 se obţine aproximaţia 523443136.0 a lui sin(40) !
Valoarea corectă este 0.745113…Acest rezultat se datorează fenomenului de
reducere (catastrophic cancellation).
13