Documente Academic
Documente Profesional
Documente Cultură
m I = − α t I −1 , M I = α t I −1 − 1 .
Dacă baza de numeraţie este doi şi sunt t I =16 cifre binare, atunci domeniul de
reprezentare pentru numere întregi este cuprins între − 215 şi 215 −1 . Dacă numărul de cifre
binare este t I = 32 , atunci domeniul de reprezentare este cuprins între − 2 31 şi 2 31 −1 .
Încercarea de a opera cu numere care nu aparţin domeniului I de reprezentare, determină, la
majoritatea calculatoarelor numerice, emiterea unor mesaje de eroare fatală, programele
implicate fiind abandonate: “depăşire (binară) inferioară” (dacă z < m I ), respectiv “depăşire
(binară) superioară” (dacă z > M I ).
Uzuală este reprezentarea în baza de numeraţie doi, alocându-se o cifră binară pentru semn şi
t I −1 cifre pentru număr, anume reprezentarea în cod complementar faţă de baza α definită
2 1. Calculul în virgulă mobilă
astfel:
z, z≥0
z c = tI .
α − | z |, z < 0
Spre deosebire de numerele întregi, în general numerele reale se reprezintă aproximativ în
calculatorul numeric. În continuare se definesc două submulţimi ale numerelor reale şi anume:
• submulţimea G care conţine numerele reale care s-ar putea reprezenta în calculatorul
numeric;
• submulţimea F care conţine numerele reale care se reprezintă efectiv în calculatorul
numeric.
În timp ce mulţimea G, ca şi mulţimea numerelor reale ℜ, are un număr infinit de
elemente, mulţimea F are un număr finit de elemente, relaţia care se poate scrie între aceste
mulţimi fiind: F ⊂ G ⊂ ℜ . Metoda cea mai larg folosită pentru reprezentarea numerelor reale
în calculator, numere care aparţin mulţimii F, este cea a virgulei mobile.
Definiţie:
Prin aritmetica virgulei mobile se înţeleg următoarele:
(a) un model matematic de reprezentare a numerelor (definirea mulţimii F);
(b) o modalitate de reprezentare a numerelor din mulţimea G în calculatorul numeric, altfel
spus o modalitate de implementare în calculator a modelului (definirea operatorului de
rotunjire, notat cu fl);
(c) operaţiile elementare: adunarea, scăderea, înmulţirea şi împărţirea definite cu numerele
mulţimii F.
Acestea sunt detaliate în secţiunile următoare ale acestui subcapitol.
Definiţie:
O mulţime de numere în virgulă mobilă este definită prin următorii parametri:
(a) β- baza maşinii de calcul;
(b) t - numărul de cifre în baza βutilizate pentru a reprezenta partea fracţionară (precizia
maşinii de calcul);
(c) L - cel mai mic exponent (limita de depăşire inferioară);
(d) U - cel mai mare exponent (limita de depăşire superioară).
Exponentul e este cuprins între valorile: L ≤ e ≤ U .
Definiţie:
Mulţimea F de numere în virgulă mobilă este:
F ={x ∈ℜ/ x = f ⋅ βe } ∪{0} , unde:
d d d
f = ± 1 + + ii + + tt , 0 ≤ d i ≤ β − 1, i = 1, , t
β β β
L≤e≤U
unde f este mantisa (fracţia), e este exponentul, βeste baza maşinii, t este numărul de cifre în
baza βşi d i sunt cifrele bazei.
Dacă pentru orice x∈ F \ {0} , prima cifră a fracţiei, d 1 , este diferită de zero, atunci se spune
că sistemul de numere în virgulă mobilă este normalizat. În acest caz, poate fi scrisă relaţia:
1 / β≤| f |<1 .
Acestea se numesc: m – cel mai mic număr real pozitiv reprezentabil, iar M – cel mai mare
număr real pozitiv reprezentabil. În acest caz, mulţimea G se poate defini ca fiind:
G = {x ∈ℜ/ m ≤| x |≤ M} ∪{0} = [ −M,−m] ∪{0} ∪[m, M ] .
Încercarea de a opera cu numere nenule care nu se încadrează între aceste limite conduce,
pentru majoritatea calculatoarelor numerice, la emiterea unor mesaje de eroare fatală, care vor
determina abandonarea programului: “depăşire flotantă inferioară” (dacă | x |< m ), respectiv
“depăşire flotantă superioară” (dacă | x |> M ). În unele implementări, se atribuie valoarea zero
pentru numerele din prima categorie menţionată, fără emiterea mesajului de eroare, împreună cu
emiterea unui mesaj de avertizare.
Exemplul 1.2:
4 1. Calculul în virgulă mobilă
Numărul elementelor mulţimii F este: card ( F) =33 . Elementele pozitive ale mulţimii F
sunt prezentate în Figura 1.1.
1 7
m= M=
4 2
0 2-2 2-1 20 21
Mulţimea F este o mulţime finită. Între puterile succesive ale lui βnumerele din mulţimea
F sunt echidistante, numărul acestora fiind constant. Numărul de elemente ale lui F este dat de
relaţia:
card ( F) = 2 ⋅ βt −1 ⋅ (β −1) ⋅ ( U − L +1) +1 ,
în care mărimea βt −1 ⋅ (β−1) =βt −βt −1 reprezintă numărul constant de elemente dintr-un
interval definit de către două puteri succesive ale bazei βşi U − L + 1 reprezintă numărul de
intervale determinate de către puterile succesive ale lui β . Produsul acestora este multiplicat
cu 2 pentru a include atât numerele pozitive, cât şi pe cele negative. Valoarea 1 este adăugată
pentru elementul 0.
Concluzii:
(a) Numerele aparţinând mulţimii F nu sunt echidistante în domeniul lor de existenţă; acestea
sunt mai “dese” în apropierea originii (puterile lui βscad) şi mai “rare” spre extremităţile
mulţimii F (puterile lui βcresc).
(b) Numerele sunt echidistante numai între puterile succesive ale lui β .
(c) Datorită faptului că mulţimea F are un număr finit de elemente, nu se pot reprezenta
continuu, în detaliu, toate numerele reale; mai mult, fiecare număr din mulţimea F este
asociat unui întreg interval din mulţimea G, deci unui întreg interval de numere reale.
Uzuală este reprezentarea normalizată în baza de numeraţie doi, alocându-se o poziţie binară
pentru semn, un număr de poziţii binare pentru exponent şi t cifre binare pentru mantisă.
Deoarece tipul de semn al numărului este memorat, pentru fracţie se realizează o reprezentare a
întregului d 1d 2 d t ⋅ β t (valoarea absolută a mantisei). De asemenea, pentru a nu se memora
semnul şi pentru exponent, se reprezintă un număr întreg pozitiv: C = e + E ≥ 0 , mărimea E
numindu-se deplasament, iar mărimea C numindu-se caracteristică. Cum reprezentarea este
normalizată, prima cifră a fracţiei este d 1 =1 şi nu se mai reprezintă. Astfel, se câştigă încă o
1.1 Aritmetica în virgulă mobilă 5
c1 c2 c3 ∈ F
Exemplul 1.4:
Se consideră un sistem de numere în virgulă mobilă cu β=10 , t = 4 . Fie numărul
x =12945 ,734 . Numărul x se poate scrie sub forma (1.1):
x = 0,12945734 ⋅10 5 = 0,1294 ⋅10 5 + 0,5734 ⋅10 5−4 ,
6 1. Calculul în virgulă mobilă
unde f =0,1294 ; e =5; g =0,5734 . Rezultă, aşadar, valoarea reţinută pentru reprezentare
şi rotunjită prin tăiere: fl ( x ) =0,1294 ⋅10 5 . Aceasta corespunde numărului 12940 ≠ x .
(b) rotunjirea simetrică: fl(x) este cel mai apropiat element c ∈F , de x ∈ G (a se vedea
Figura 1.3).
Analizând Figura 1.3, rezultă că oricare ar fi numerele x şi y din intervalul definit de
elementele aflate la mijlocul intervalelor (c1 , c 2 ) şi, respectiv, (c 2 , c 3 ) , acestea vor fi
reprezentate prin elementul c 2 al mulţimii F, expresia pentru fl(x) fiind în acest caz:
β
f ⋅ βe , | g |< 0,
2.
fl( x ) =
f ⋅ β e ± β e −t , | g |≥ 0, β
2
În ultima expresie, semnul “+” se consideră pentru f > 0 şi semnul “-“ se consideră pentru
f <0 .
x y
c1 c2 c3 ∈ F
Neajunsul acestei maniere de reprezentare constă în faptul că dacă numărul x este situat la
jumătatea distanţei dintre două numere consecutive din mulţimea F, atunci fl(x) poate lua
oricare din cele două valori învecinate.
(c) rotunjirea uniformă (metoda cifrei pare)
În acest caz, fl(x) are următoarea expresie:
β
f ⋅ βe , | g |< 0,
2
f β
⋅ β e ± β e−t , | g |> 0,
fl( x ) = 2 .
f β
⋅ β e ± β e−t , | g |= 0, , ultima cifra f − impara
2
β
f ⋅ βe , | g |= 0, , ultima cifra f − para
2
În această expresie de definiţie, semnul “+” se consideră pentru f > 0 şi semnul “-“ se
consideră pentru f < 0 . Această modalitate de reprezentare este adoptată şi de standardul
IEEE.
1.1 Aritmetica în virgulă mobilă 7
Exemplul 1.5:
Se consideră β=10 , t = 4 şi o rotunjire uniformă.
(a) x =12944 ,9942 = 0,1294 ⋅10 5 + 0,4994 ⋅10 5−4 .
Se observă că |g| este mai mic decât 0.5, deci:
fl ( x ) = 0,1294 ⋅10 5 ( =12940 ≠ x ) .
(b) x =129551 = 0,1295 ⋅10 6 + 0,51 ⋅10 6 −4 .
Se observă că |g| este mai mare decât 0.5, deci:
fl ( x ) = 0,1295 ⋅10 6 +10 6 −4 ( =129600 ≠ x) .
4 4 −4
(c) x =1297 ,5 = 0,1297 ⋅10 + 0,5 ⋅10 .
Se observă că |g| este egal cu 0.5 şi ultima cifră a lui f este impară, deci:
fl ( x ) = 0,1297 ⋅10 4 +10 4 −4 (=1298 ≠ x ) .
(d) x =1296 ,5 = 0,1296 ⋅10 4 + 0,5 ⋅10 4 −4 .
Se observă că |g| este egal cu 0.5 şi ultima cifră a lui f este pară, deci:
fl ( x ) = 0,1296 ⋅10 4 ( =1296 ≠ x ) .
În expresia anterioară, |x| s-a aproximat prin |fl(x)| deoarece, în general, valoarea x nu se
cunoaşte în sensul că nu se poate reprezenta exact în calculator. Se demonstrează că eroarea
relativă maximă se produce când f ia cea mai mică valoare şi g ia cea mai mare valoare, adică
f =1 / β şi g =1 :
| x − fl ( x ) | | f ⋅ βe + g ⋅ βe −t − fl ( x ) | 1 ⋅ βe −t
εx = = ≤k ⋅ ≅ k ⋅ β1−t ,
| fl( x ) | | fl ( x ) | (1 / β) ⋅ βe
1−t
unde β este o mărime specifică maşinii de calcul, ea caracterizând precizia relativă de
reprezentare. Această mărime se mai numeşte şi cea mai mare spaţiere relativă şi este asociată
cu rotunjirea prin tăiere, pentru care k = 1 . Pentru rotunjirea simetrică, rezultă k =1 / β şi
atunci eroarea relativă maximă are valoarea β−t , mărime denumită cea mai mică spaţiere
relativă.
Definiţiile anterioare se pot extinde imediat la cazul vectorial, pentru elemente dintr-un
spaţiu vectorial normat (a se vedea Anexa A). Astfel, considerând vectorul cu componente reale
x = [ x 1 x n ] T , unde “T” reprezintă operaţia de transpunere vectorială, se definesc
următoarele:
8 1. Calculul în virgulă mobilă
rotunjire prin tăiere. Fie calculul: 1,001 −1 . Se obţine: fl (1,001 −1) =0 , rezultat eronat.
Exemplele 1.6 şi 1.7 pun în evidenţă două fenomene nedorite şi generatoare de erori, care
pot apare la efectuarea unei adunări în virgulă mobilă:
(a) omiterea catastrofală: apare atunci când se adună doi termeni şi valoarea absolută a unui
termen este mai mică decât precizia de reprezentare a celuilalt termen; în acest caz,
rezultatul este dat de termenul cu valoare absolută mai mare (această situaţie este ilustrată
în Exemplul 1.6).
(b) neutralizarea termenilor: apare atunci când se adună numere cu semne diferite şi cu
valori absolute apropiate; în acest caz, în mod eronat, rezultatul este nul (această situaţie
este ilustrată în Exemplul 1.7).
Precizia calculelor numerice este caracterizată de două mărimi constante a căror valoare este
dependentă de tipul maşinii de calcul folosite. Cele două valori menţionate, numite şi “constante
de maşină”, sunt introduse prin următoarea definiţie.
Definiţie:
Epsilonul maşină pentru adunare (notat ε+
m ) reprezintă cel mai mic număr real pozitiv
În Figura 1.4 sunt ilustrate cele două definiţii. Conform Figurii 1.4, sunt îndeplinite
relaţiile:
• adunare: fl (1 + ε+m ) >1, fl (1 + c) =1 ;
• scădere: fl (1 − ε+m ) <1, fl (1 − c) =1 .
c ∈F εm- εm+ 1
Exemplul 1.8:
Valorile celor două constante de maşină, în standardul IEEE, sunt următoarele:
• pentru reprezentarea în simplă precizie:
ε −m = 5.96 ⋅ 10 −8 ; ε +m = 1.19 ⋅ 10 −7 ;
Următorul algoritm, descris în limbaj pseudocod (a se vedea Anexa B), descrie modul de
calcul al epsilonului maşină pentru adunare, rezultatul final gasindu-se în variabila eps_p:
atribuie eps_p ← 1
cât timp ( 1 + eps _ p > 1 ) execută
atribuie eps_p ← 0.5*eps_p
atribuie eps_p ← 2*eps_p.
C. Înmulţirea
Oricare ar fi x şi y, două numere din mulţimea G, pentru care există fl(x) şi, respectiv, fl(y)
aparţinând multimii F, numărului x ⋅ y i se asociază numărul fl ( x ⋅ y) , care se determină cu
algoritmul următor:
Pas 1: se reprezintă intern numerele x şi y prin fl(x) şi, respectiv, fl(y).
Pas 2: se înmulţesc fracţiile şi se adună exponenţii.
Pas 3: din fracţia rezultată se opresc t cifre.
Pas 4: dacă este necesar, se normalizează rezultatul.
Observaţii:
1. Înmulţirea nu este asociativă.
2. Împărţirea se realizează în aceeaşi manieră ca şi înmulţirea, cu deosebirea că la pasul 2
mantisele se împart, iar exponenţii se scad.
Exemplul 1.9:
Se consideră o aritmetică a virgulei mobile cu β=10 , t = 3 , reprezentare normalizată şi
rotunjire prin tăiere. Fie x = 22 ,547 şi y = 0,43936 . Rezultă fl ( x ⋅ y) = 9,900 .
când o expresie de calcul conţine o infinitate de termeni) şi calculele sunt oprite, în funcţie de
un anumit criteriu, atunci când se ajunge la o anumită precizie acceptabilă (aşadar
conştientizată).
Erorile de reprezentare sunt datorate posibilităţii efective de a reprezenta numerele în
calculatorul numeric. Acest tip de erori se manifestă în datele iniţiale, intermediare şi în cele de
ieşire care constituie rezultatele finale.
Definiţie:
Se numeşte calcul aproximativ, un calcul efectuat într-o aritmetică a virgulei mobile.
Fie x şi y două numere aparţinând mulţimii G şi reprezentate în mulţimea F prin fl(x) şi,
respectiv, fl(y). Fie ∗ una din operaţiile elementare definite anterior. Atunci, pot fi scrise
următoarele relaţii:
x = fl ( x ) + e x , y = fl ( y) + e y , εx = e x / fl ( x ), ε y = e y / fl ( y) ,
x ∗ y = fl ( x ∗ y) + e x ∗y , εx∗y = e x∗y / fl ( x ∗ y) .
• pentru scădere:
fl ( x ) fl ( y)
k1 = , k 2 =− ;
fl ( x ) − fl ( y) fl ( x ) − fl ( y)
• pentru înmulţire:
k1 = k 2 = 1 ;
• pentru împărţire:
k 1 = 1, k 2 = −1 .
12 1. Calculul în virgulă mobilă
şi atunci:
T2 ≤ k ⋅ β1−t ,
-1
-2
-3
-4
-5
0.985 0.99 0.995 1 1.005 1.01 1.015
Analizând Figura 1.5, se remarcă faptul că valorile calculate sunt de ordimul a 10 −14 , ceea
ce evidenţiază erori relativ mici între rezultatele celor două maniere de calcul. Aceste diferenţe
se explică prin fenomenele de neutralizarea termenilor şi omitere catastrofală.
Cele expuse până acum demonstrează faptul că într-un calcul numeric erorile se propagă de
la o operaţie la alta. Pe măsură ce numărul operaţiilor dintr-un calcul creşte, pot apare situaţii în
care erorile se acumulează excesiv de mult, fapt care determină obţinerea unei valori total
1.1 Aritmetica în virgulă mobilă 13
Implementând aceste relaţii de calcul într-un program scris într-un limbaj oarecare şi executat
pe un calculator cu o aritmetică a virgulei mobile având baza β=2 , se obţin rezultatele:
e ≠ 0, f ≠ 0, q = valoare finită.
− b ± b2 − 4 ⋅ a ⋅ c
x 1, 2 = , b2 − 4 ⋅ a ⋅ c ≥ 0 .
2⋅a
14 1. Calculul în virgulă mobilă
Utilizând aceste relaţii de calcul, pentru determinarea soluţiilor ecuaţiei cu ajutorul unui
calculator având β=10 , t = 8 , L = −50 şi U = 50 , se obţin următoarele rezultate:
• pentru a =1 , b = −10 5 , c =1 : x 1 = 10 5 şi x 2 = 0 , în timp ce valorile adevărate
sunt x 1,a = 99999 .99999 şi x 2,a = 0.00001 .
• Diferenţele se datorează fenomenului de omitere catastrofală care apare la calculul
discriminantului: b 2 − 4 ⋅ a ⋅ c ≅ b 2 , pentru datele prezentate.
• pentru a = 6 ⋅10 30 , b = 5 ⋅ 10 30 , c = −4 ⋅10 30 , programul va fi abandonat cu emiterea
mesajului de “depăşire flotantă superioară”; această eroare se produce la calculul
discriminantului, atunci când b este ridicat la puterea a doua.
• pentru a =1 , b = −4 , c = 4 −10 −8 : x 1 = x 2 = 2 , rezultat care este eronat, datorită
fenomenului de neutralizare a termenilor apărut la calculul discriminantului.
Pentru a evita obţinerea de rezultate eronate, se adoptă următoarea soluţie:
(a) pentru a evita depăşirea flotantă superioară care s-ar putea produce la calculul lui b 2 ,
precum şi pentru evitarea fenomenului de omitere catastrofală, se rescrie discriminantul
sub forma:
δ = ∆ = ( b / 2) 2 − a ⋅ c .
Dacă | b / 2 |≥ c , se foloseşte relaţia de calcul:
δ =| b / 2 | ⋅ 1 − ( 2 ⋅ a / b) ⋅ ( 2 ⋅ c / b) ,
în care factorul 2 ⋅ c / b ≤ 1 .
Dacă | b / 2 |< c , se foloseşte relaţia de calcul:
δ = | c | ⋅ ( b / 2) ⋅ [b /( 2⋅ | c | )] − a ,
în care factorul b /( 2⋅ | c |) ≤1 .
(b) după calculul discriminantului, pentru evitarea neutralizării termenilor, se calculează mai
întâi rădăcina cu modulul mai mare, ţinând cont de semnul lui b:
x 1 = −(b / 2 + sign ( b) ⋅ δ) / a .
Rădăcina cu modulul mai mic se determină folosind relaţiile lui Viète între rădăcini şi
coeficienţi:
x 2 = c /( a ⋅ x 1 ) .
G
G(D)
D
≈ ≈
*
G(D )
D*
G
spaţiul datelor spaţiul soluţiilor
Altfel spus, o problemă este bine condiţionată dacă mici perturbaţii în una sau toate datele
iniţiale ale problemei conduc la mici perturbaţii în datele de ieşire (rezultate sau soluţii).
Observaţie:
Pentru a caracteriza “apropierea” sau “îndepărtarea” dintre D şi D ∗ , respectiv G ( D) şi
G ( D ∗) , trebuie cunoscute două elemente: natura datelor D şi natura soluţiilor G ( D) .
Dacă D şi G ( D) aparţin mulţimii numerelor complexe, atunci se va folosi funcţia modul
pentru a aprecia diferenţele | D − D ∗ | şi, respectiv, | G (D) −G ( D ∗) | .
16 1. Calculul în virgulă mobilă
Dacă D şi G ( D) sunt elementele unui spaţiu liniar finit dimensional (vectori, matrice), se
vor folosi, corespunzător, norme vectoriale, respectiv matriciale.
În cele ce urmează, se notează generic erorile absolute ale mărimilor implicate cu:
e D =| D − D ∗ | şi e G =| G (D) − G (D ∗ ) | .
Se poate defini numărul de condiţie al problemei G ca fiind raportul dintre eroarea absolută
în soluţiile problemei de calcul şi eroarea absolută în datele de intrare ale problemei de calcul:
k (G ) = e G / e D .
Dacă acest număr de condiţie este egal cu 1 sau are valori apropiate de 1, se spune că
problema este bine condiţionată. Dacă numărul de condiţie este mare sau foarte mare, atunci
erorile în datele iniţiale sunt amplificate în soluţia problemei de calcul exactă matematic,
problema de calcul fiind prost condiţionată.
Exemplul 1.13:
Rezolvarea ecuaţiilor polinomiale este o problemă prost condiţionată. Fie Pn ( x ) un
polinom de gradul n:
Pn ( x ) = a 0 ⋅ x n + a 1 ⋅ x n −1 + + a n −1 ⋅ x + a n ,
a 1 0 0 a 1 0 0
0 a 1 0 a 1
A = 0 , A p = 0 .
1 1
0 0 a
nxn
ε 0 a
nxn
p n (λ) = (λ − a ) n − (−1) n ⋅ ε .
ε = −10 −10 , atunci se obţin 10 valori proprii complex conjugate, dispuse în planul complex pe
un cerc cu centrul în punctul de coordonate (a,0) şi de rază egală cu 10 10 −10 = 0.1 . Cu
valorile numerice considerate, în cazurile particulare ale unei perturbaţii ε nenule, numărul de
condiţie al acestei probleme este:
k = e G / e D = 10 −1 / 10 −10 = 10 9 ,
deci eroarea din datele iniţiale ale problemei de calcul a fost amplificată de 10 9 ori în soluţiile
calculate.
În practică, datorită acestui fapt, nu se calculează valorile proprii ale unei matrice prin
aducerea matricei la forma canonică Jordan, utilizată în cadrul acestui exemplu, pentru că pot
apare perturbaţii cel puţin de genul celor prezentate.
Se consideră o problemă de calcul oarecare care lucrează cu setul de date exacte D. Soluţia
exactă matematic a acestei probleme este dată de “funcţia” G. Se consideră, în plus, datele
perturbate ale problemei, D ∗ .
La implementarea funcţiei G pe un calculator numeric, practic se lucrează cu un algoritm
∗
G (a se vedea Figura 1.7).
G
G(D*)
D*
≈ ≈
*
G (D)
D
G*
spaţiul datelor spaţiul soluţiilor
problemei de calcul G fiind apropiate într-un anumit sens, atunci şi soluţia exactă matematic
corespunzătoare setului de date perturbate G(D*) este apropiată, într-un anumit sens, de
soluţia algoritmului corespunzătoare setului de date exacte G*(D). Altfel, algoritmul se spune
că este instabil din punct de vedere numeric.
Altfel spus, erorile din datele de intrare sunt micşorate de un algoritm stabil numeric, un
algoritm instabil numeric amplificându-le.
Observaţii:
(a) Nu se poate aştepta ca un algoritm stabil numeric să rezolve o problemă prost
condiţionată cu o precizie mai mare decât a datelor de intrare.
(b) Un algoritm instabil numeric furnizează, de regulă, rezultate eronate chiar pentru
probleme bine condiţionate.
Definiţie:
Un algoritm numeric se spune că este general dacă este aplicabil pentru un domeniu larg de
date de intrare.
Definiţie:
Un algoritm se spune că este sigur în funcţionare, dacă are prevăzut un mecanism care să
avertizeze atunci când erorile au crescut excesiv de mult.
Observaţie:
Un algoritm instabil numeric poate fi sigur în funcţionare, dacă este capabil să detecteze
instabilitatea numerică.
Concluzie:
Rolul calculului numeric (al analizei numerice) este de a analiza natura problemelor de
calcul şi de a realiza o proiectare optimă a algoritmilor. Dacă problema de calcul este prost
condiţionată, atunci aceasta se reformulează, echivalent, obţinând o problemă bine condiţionată.
Mai departe, pentru problema bine condiţionată rezultată, se proiectează un algoritm care să fie
stabil numeric, general şi sigur în funcţionare.
Exemplul 1.14:
Un exemplu de algoritm instabil numeric este cel folosit pentru calculul integralei definite:
1
I n = ∫ x n ⋅ e x −1 ⋅ dx ,
0
Î1 ≅ 0.367879
Î 9 ≅ −0.068400 <0 !
dar, pentru I 9 , integrandul x 9 ⋅ e x −1 este pozitiv pentru x ∈(0,1) . Aşadar, s-a obţinut pentru
I 9 o valoare eronată. Singura eroare comisă a fost cea în estimarea lui 1 / e , care determină o
eroare în evaluarea lui I 1 egală cu e1 = 4.412 ×10 −7 . Pentru evaluarea lui I 2 , eroarea
comisă este e 2 ≅ ( −2) ⋅ e1 ; pentru I 3 eroarea comisă este e 3 ≅ (−3) ⋅ e 2 şi aşa mai departe
până la I 9 când se obţine o eroare e 9 = 9!⋅e1 = 0.1601 . Î 9 + e 9 = 0.0916 , ceea ce
reprezintă rezultatul exact cu patru cifre zecimale. Aceste rezultate arată că algoritmul utilizat
este instabil numeric.
Stabilizarea algoritmului se poate realiza rescriind relaţia de recurenţă sub forma:
I n −1 = (1 − I n ) / n = 1 / n − I n / n , n = , 3, 2 .
scrie ‘e = ’, e
atribuie f ← (y+y+y+y+y) - h
scrie ‘f = ’, f
atribuie q ← f/e
scrie ‘q = ’, q
Să se explice rezultatele obţinute.
E1.2 Să se realizeze, într-un limbaj de programare, un program conţinând următoarea secvenţă
de instrucţiuni descrisă în limbajul pseudocod:
atribuie h ← 1/10
atribuie x ← 0
pentru i = 1:10 execută
atribuie x ← x + h
atribuie dif1 ← 1 - x
scrie ‘* test adunare:’
scrie ‘x = ’, x
scrie ‘dif1 = ’, dif1
atribuie y ← 10 * h
atribuie dif2 ← 1 - y
scrie ‘* test inmultire:’
scrie ‘y = ’, y
scrie ‘dif2 = ’, dif2
Să se explice rezultatele obţinute.
E1.3 Se considera problema evaluării, în diverse puncte x, a funcţiei e x . Calculul se bazeaza
pe dezvoltarea în serie Taylor, în jurul originii, a funcţiei şi oprirea unui anumit număr de
termeni, la precizia maşinii.
Să se realizeze, într-un limbaj de programare (de exemplu MATLAB), un program pentru
următorul algoritm, descris parţial în limbajul pseudocod:
atribuie IndRel ← 1
cât timp ( IndRel = 1 ) execută
scrie ‘x = ’
citeşte x
atribuie sum ← 1
atribuie trm ← 1
atribuie n ← 0
atribuie olds ← sum
atribuie n ← n + 1
atribuie trm ← trm * x/n
atribuie sum ← sum + trm
cât timp ( sum ~= olds ) execută
1.1 Aritmetica în virgulă mobilă 21
Aşa cum s-a prezentat în Exemplul 1.12, la rezolvarea numerică a acestui tip de ecuaţii
pot apare o serie de probleme care afectează, pe de o parte, precizia calculelor şi, pe de
altă parte, posibilitatea efectivă de calcul prin apariţia unor depăşiri în virgulă mobilă. În
aceste condiţii se propune un algoritm care încearcă să depăşească dificultăţile
menţionate.
Să se realizeze, într-un limbaj de programare (de exemplu MATLAB), un program pentru
următorul algoritm, descris parţial în limbajul pseudocod. Programul va conţine etapele
menţionate în continuare:
1. Introducere coeficienţi ecuaţie, în ordinea descrescătoare a puterilor lui z, în
variabilele a, b, c, respectiv.
2. Calcul soluţii după următorul algoritm:
1.1 Aritmetica în virgulă mobilă 23
dacă ( a = 0 ) atunci
dacă ( b = 0 ) atunci
atribuie z1r ← 0
| atribuie z1i ← 0
| atribuie z2r ← 0
| atribuie z2i ← 0
| altfel
| atribuie z1r ← 0
| atribuie z1i ← 0
| atribuie z2r ← -c/b
| atribuie z2i ← 0
| altfel
| dacă ( c = 0 ) atunci
atribuie z1r ← 0
| atribuie z1i ← 0
| atribuie z2r ← - b/a
| atribuie z2i ← 0
| altfel
| atribuie bp ← b/2
| dacă ( abs( bp) >= abs(c) ) atunci
| atribuie e ← 1 – (a/bp) * (c/bp)
| | atribuie d ← sqrt( abs( e)) * abs(bp)
| | altfel
| | atribuie e ← a
| | dacă ( c < 0 ) atunci
| | atribuie e ← -a
| |
| | atribuie e ← bp * ( bp/abs(c) ) - e
| | atribuie d ← sqrt( abs( e)) * sqrt( abs(c) )
|
| dacă ( e >= 0 ) atunci
| dacă ( bp >= 0 ) atunci
| | atribuie d ← -d
| |
| | atribuie z1r ← ( - bp + d )/a
| | atribuie z1i ← 0
| | atribuie z2r ← 0
| | dacă ( z1r ~= 0 ) atunci
| | atribuie z2r ← ( c/z1r )/a
| |
| | atribuie z2i ← 0
| | altfel
24 1. Calculul în virgulă mobilă
atribuie k ← 0
cât timp ( s u m_ v ≠ s u m_ n ) execută
atribuie k ← k + 1
* calculează term ca funcţie de k şi x
atribuie s u m_ v ← s u m_ n
atribuie sum_n ←sum_v + term
atribuie f ← sum _ n
scrie ‘funcţie calculată (x) = ‘, f
În descrierea anterioară, f reprezintă valoarea aproximativă a expresiei de evaluat.
(a) Folosind algoritmul general, să se descrie, în limbaj pseudocod, algoritmul pentru
calculul seriei infinite divergente:
S =1 + 1/ 2 + 1/ 3 + 1/ 4 + + 1/ n + .
(b) Să se implementeze într-un limbaj de programare algoritmul obţinut la punctul (a) şi
să se execute programul obţinut.
(c) Să se explice de ce seria dată nu este divergentă atunci când aceasta este evaluată cu
un calculator numeric.
(d) Să se completeze programul obţinut la punctul (b), calculând seria de la punctul (a)
prin evaluarea de la dreapta la stânga (pornind de la cel mai mic termen semnificativ
pentru sumă).
(e) Să se compare rezultatele de la punctele (b) şi (d). Să se explice diferenţele, dacă
acestea există.
P1.7 Se consideră calculul funcţiei sin(x) utilizând exprimarea acesteia drept o serie (infinită)
de puteri:
x3 x5 x7
sin( x ) = x − + − + ... ,
3! 5! 7!
şi următorul algoritm descris în limbajul pseudocod:
scrie ‘x =’
citeşte x
atribuie sinx ← 0
atribuie term ← x
atribuie k ← 1
cât timp ( sinx + term ~= sinx ) execută
atribuie sinx ← sinx + term
atribuie term ← - (x^2) / ( (k+1)*(k+2) ) * term
atribuie k ← k + 2
atribuie f ← sinx
scrie ‘funcţie calculată sin(x) = ‘, f
1.1 Aritmetica în virgulă mobilă 29
Să se explice motivul pentru care ciclul cu test iniţial (cât timp - execută) se parcurge de
un număr finit de ori.
Să se răspundă la urmâtoarele întrebări, variabila x luând succesiv valorile
π / 2, 11 ⋅ π / 2, 21 ⋅ π / 2, 31 ⋅ π / 2 , implementând algoritmul într-un limbaj de
programare:
(a) Cât de precis este rezultatul calculat?
(b) Care este numărul de termeni folosiţi din seria de puteri?
(c) Care este cel mai mare termen folosit din seria de puteri?
Implementând algoritmul prezentat în mediul de programare MATLAB,, să se compare
rezultatele astfel obţinute cu cele furnizate prin utilizarea funcţiei MATLAB sin,
corespunzătoare valorilor precizate pentru argumentul x. Să se explice diferenţele
obţinute şi, dacă este cazul, să se corecteze algoritmul astfel încât diferenţele între cele
două variante (funcţia MATLAB sin şi algoritmul corectat) să fie cât mai mici posibile.