Sunteți pe pagina 1din 27

Operatii cu virgula mobila

Operatii cu virgula mobila

• Integers permit reprezentarea exacta a valorilor numerice


• nu permit realizarea de operatii cu marimi fractionare sau cu
valori foarte mari
• Virgula mobila permite acest lucru, dar se sacrifica precizia si,
in anumite cazuri, viteza
• Intel a introdus pentru operatiile cu virgula mobila
coprocesorul matematic, insa pentru versiunile anterioare
80x86 acesta era optional si daca lipsea trebuia simulat
software
Operatii cu virgula mobila

• Operaţiile în virgulă fixă sunt comode pentru structurile


omogene de date, cand toate numerele reale sunt subunitare,
insă această reprezentare este ineficientă în calculele
ştiinţifice, unde simultan se lucrează cu numere foarte mari şi
numere foarte mici
• Numere reprezentate în virgulă mobilă pot fi numere întregi
sau fracţionare, a căror valoare este dată de relaţia:
x = M * bE
unde b este valoarea bazei, M este număr subunitar
numit mantisă, iar E este un exponent. În calculatoarele actuale
se utilizează b = 2 sau 16.
Operatii cu virgula mobila

• Numărul reprezentat în virgulă mobilă este normalizat,


dacă prima cifră după virgulă a mantisei este diferită de
zero.
Exemplu:
• Numărul 23 se va exprima în virgulă mobilă astfel:
23 = (10111)2 = 0,10111*25,
unde M = 0,10111; b = 2; E = 5.
• Numărul –0,375 se va exprima în virgulă mobilă astfel:
–0,375 = (-0,011)2 = -0,11 * 2-¹
M = -0,11; b = 2; E = -1.
• Există mai multe variante de reprezentare a mantisei şi
exponentului pe n poziţii binare.
Matematica operatiilor cu virgula mobila

• Operatiile cu virgula mobila nu urmeaza regulile matematicii


clasice, dar majoritatea le utilizeaza pe acestea => BUGS
• Algebra uzuala se aplica in cazul marimilor infinit precise, e.g:
X = X + 1, X - integer
utilizeaza regulile clasice atat timp cat nu avem integer overflow
• Pentru numere reprezentate cu virgula mobila avem o
mantisa si un exponent, e.g. 1.63e1
• Reprezentarea este realizata pentru un numar semnificativ de
cifre
Matematica operatiilor cu virgula mobila
Exemple:
• să se efectueze în virgulă mobilă 15+1,75
x = 15 = (1111)2 = 0,1111*24
y = 1,75 = (1, 11)2 = 0,111*2¹
deoarece x are exponentul mai mare, y se va alinia cu 3 poziţii:
y = 0,000111 * 24.
x+y= 0,111100*24
0,000111*24
__________
1,000011*24
normalizand, obţinem x+y=0,1000011*25=16,75.
• să se efectueze în virgulă mobilă 13 – 0,25.
x = 13 = (1011)2 = 0,1011*24
y = 0,25 = (0,01) 2 = 0,1*2-¹
deoarece x are exponentul mai mare, y se va alinia cu 5 poziţii:
x–y= 0,101100*24
0,000001*24
__________
0,101011*24
• Normalizarea rezultatului nu este necesară. Rezultatul este x-y=0,101011*24=12,75
Precizia operatiilor cu virgula mobila

Ex: sa se adune 1.23e1 si 4.56e0


• Pentru acesta trebuie sa se ajusteze valorile astfel incat sa
aibe acelasi exponent
4.56e0 -> 0.456e1
1.23e1 + 0.456e1 = 1.686e1
• Problema e ca nu se potriveste in cele trei cifre semnificative,
a.i. trebuie realizata o rotunjire /trunchiere -> rezultatul este
1.69e1
• Rezultatul a fost obtinut pentru ca s-au utilizat mai multe cifre
in timpul efectuarii calculelor (guard bits); daca operatiile sunt
limitate atunci rezultatul este si mai imprecis
• Erorile se acumuleaza si pot afecta semnificativ rezultatul final
Erori in operatiile cu virgula mobila

• Un exemplu interesant este


1.23e3 + 1.00e0  1.23e3+0.001e3 = 1.23e3
• Rezultatul pare sa fie ok, dar daca se aduna de zece ori 1.00e0
se obtine acelasi lucru (1.23e3) sau 1.24e3 in functie de
ordinea in care se efectueaza operatiile
• Observatia 1: ordinea operatiilor poate afecta rezultatul final.
Cele mai bune rezultate se obtin daca se grupeaza exponentii
de marime apropiata
Erori in operatiile cu virgula mobila
• In cazul scaderii se poate intalni fenomenul de falsa precizie
• Daca se scad 1.23e0 si 1.22e0 rezultatul este 0.01e0  1.00e-
2
• Valoarea aceasta sugereaza ca ultimele doua cifre sunt exact
zero dar de fapt acest lucru nu este corect
• Observatia 2: la scaderea a doua numere cu acelasi semn sau
suma a doua numere de semn schimbat se poate obtine un
rezultat cu precizie mai scazuta decat al marimilor initiale
• Inmultirea sau adunarea nu sufera de aceeasi problema dar
multiplica eroarea deja existenta a.i. rezultatul final este mai
imprecis
Erori in operatiile cu virgula mobila

• Observatia 3: cand se realizeaza un sir de operatii care contine


adunari, scaderi, inmultiri sau impartiri, inmultirile si
impartirile ar trebui efectuate la inceput.
• De ex daca se transforma x * (y + z) in x * y + x* z precizia ar fi
imbunatatita
• Observatia 4: cand se inmultesc numere ar trebui grupate
cele mari si cele mici, cand se impart numere ar trebui sa se
grupeze numere cu ordin de marime similar
• In acest fel se evita overflow-ul si underflow-ul
Comparatii

• In cazul marimilor reprezentate in virgula mobila comparatia


directa poate sa nu ajute
• Ex: 1.31e0 + 1.69e0 = 3.00e0 iar 2.5e0 + 1.5e0 = 3.00e0 dar
cele doua rezultate ar putea sa nu fie egale, deoarece testul
pentru egalitate reuseste doar daca toti bitii sunt egali.
• Modul standard in care se poate realiza testul este
if Value1 >= (Value2-error) and Value1 <=
(Value2+error) then …
unde error este stabilita arbitrar
• O alta metoda este:
if abs(Value1-Value2) <= error then …
Comparatii

• Numerele reprezentate in virgula mobila trebuie comparate


tot timpul utilizand intervale

= if abs(x-y) <= error then …


≠ if abs(x-y) > error then …
< if (x-y) < error then …
≤ if (x-y) <= error then …
> if (x-y) > error then …
≥ if (x-y) >= error then …
IEEE floating point formats

• Pentru a satisface o gama extinsa de cerinte legate de


performanta si acuratete Intel a introdus trei tipuri de
reprezentari in virgula mobila: simpla precizie, dubla precizie
si precizie extinsa
• Precizia simpla si dubla corespund float si double din C
• Precizia extinsa contine 16 biti extra care pot fi utilizati ca
guad bits
Reprezentari

• Formatul precizie simpla pe 32 de biti

• Formatul 64 biti dubla precizie

• Precizie extinsa pe 80 de biti


Reprezentari

• Formatul de precizie extinsa a fost implementat pentru a


putea garanta acuratetea operatiilor in cazul secventelor de
operatii
• Foloseste 80 de biti, 12 biti adaugati mantisei si 4 la exponent
• Incepand de la 80x86 toate calculele sunt efectuate utilizand
acest format..
• Precizia extinsa garanteaza existenta unui numar suficient de
guard bits
Registrii FPU

• 8086 nu putea efectua operatii in virgula mobila a.i. au


adaugat o unitate pentru virgula mobila (FPU)
• 80386 si urmatoarele procesoare adauga opt registri pentru
datele in virgula mobila
• Registrii de date FP sunt similari celor uzuali, cei de control
contin biti care seteaza modul de tratare a erorilor de tipul
rotunjiri, controlul preciziei, etc.
• Registrul status este similar flag register
Registrul de date FPU

• Sunt opt registri de 80 de biti, organizati ca un stack


• Registrii sunt referiti ca ST(0) … ST(7)
• Ax e ax tot timpul, dar ST(0) este varful stivei, ST(1) urmatorul,
s.a.m.d
• Majoritatea instructiunilor FP fac push si pop la stiva, a.i. ST(1)
poate deveni ST(0)
Registrul de control
Registrul status
Setul de instructiuni FPU

• Transfer de date:
- fld: loads floating point into stack
- Fst, fstp: copie valoarea din varful stivei in alta locatie a stivei
sau intr-o variabila
- Fxch: schimba valoarea din varful stivei cu o valoare din
registrii FPU
• Conversii:
- fild: converteste un integer in extended precision si face push
in varful stivei
- Fist si fistp: converteste extended precision intr-un integer si
salveaza valoarea in memorie pe baza setarilor de rotunjire
din registrul de control FPU (bitii 10 si 11)
- Fbld si fbstp – incarca si stocheaza valori BCD pe 80 de biti
Conversia integer – floating point

• Itof – converteste valori 16 biti din ax intr-o valoare floating


point
• Ltof si ultof – convertesc o valoare pe 32 biti signed (ltof) sau
unsigned (ultof) din dx:ax in floating point
• Ftoi – floating to integer, conversia este prin truncare; daca
apare un overflow atunci ftoi returneaza carry flag. Ftou face
conversia floating point to unsigned int
• Ftol si ftoul – face conversia floating point in 32 biti int,
signed/unsigned
Instructiuni de comparare
• FCOM COMpare ST(0) to a floating point value
• FCOMI COMpare ST(0) to ST(i) and set CPU flags
• FCOMIP COMpare ST(0) to ST(i) and set CPU flags and Pop ST(0)
• FCOMP COMpare ST(0) to a floating point value and Pop ST(0)
• FCOMPP COMpare ST(0) to ST(1) and Pop both registers
• FICOM COMpare ST(0) to an integer value
• FICOMP COMpare ST(0) to an integer value and Pop ST(0)
• FTST TeST ST(0) by comparing it to +0.0
• FUCOM Unordered COMpare ST(0) to a floating point value
• FUCOMI Unordered COMpare ST(0) to ST(i) and set CPU flags
• FUCOMIP Unordered COMpare ST(0) to ST(i) and set CPU flags and Pop
ST(0)
• FUCOMP Unordered COMpare ST(0) to a floating point value and Pop ST(0)
• FUCOMPP Unordered COMpare ST(0) to ST(1) and Pop both registers
• FXAM eXAMine the content of ST(0)
Instructiuni aritmetice

• Fadd si faddp: adunare


• Fsub, fsubp, fsubr si fsubrp: scadere
• Fmul si fmulp: inmultire
• Fdiv, fdivp, fdivr si fdivrp: impartire, e.g.:

fdiv st(0), st(i) ;st(0) := st(0)/st(i)


fdiv st(i), st(0) ;st(i) := st(i)/st(0)
fdivp st(i), st(0) ;st(i) := st(i)/st(0)
fdivr st(i), st(i) ;st(0) := st(0)/st(i)
fdivrp st(i), st(0) ;st(i) := st(0)/st(i)
Instructiuni cu intregi

• FIADD ADD an Integer located in memory to ST(0)


• FIDIV DIVide ST(0) by an Integer located in memory
• FIDIVR DIVide an Integer located in memory by ST(0)
• FIMUL MULtiply ST(0) by an Integer located in memory
• FISUB SUBtract an Integer located in memory from ST(0)
• FISUBR SUBtract ST(0) from an Integer located in memory
Instructiuni transcedentale :)

• FCOS COSine of the angle value in ST(0)


• FPATAN Partial ArcTANgent of the ratio ST(1)/ST(0)
• FPTAN Partial TANgent of the angle value in ST(0)
• FSIN SINe of the angle value in ST(0)
• FSINCOS SINe and COSine of the angle value in ST(0)
• F2XM1 2 to the X power Minus 1
• FSCALE SCALE ST(0) by ST(1)
• FYL2X Y*Log2X
• FYL2XP1 Y*Log2(X+1)
Alte instructiuni

• FNOP No OPeration
• FPREM Partial REMainder rest
• FPREM1 Partial REMainder 1 rest, calculat conform standardul
IEEE 754
• FXTRACT eXTRACT exponent and significand
• FWAIT asteapta
• FSAVE, FNSAVE, FRSTOR: salveaza si incarca starea FPU.
Destinatia trebuie sa fie de cel putin 94 de bytes

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