Sunteți pe pagina 1din 28

Lucrarea 1

ERORI
SCOPUL LUCRRII
n prima parte a lucrrii se prezint conceptele fundamentale ale reprezentrii numerelor reale, utile n toate problemele de metode numerice. ntr-un fel sau altul tehnicile prezentate intervin n etapele de preluare i prelucrare a datelor, chiar dac nu n mod vizibil. n cea de-a doua parte a lucrrii sunt aduse n discuie grafurile de procedur, ca metod de calcul a marginii erorii relative pentru diferite expresii i aplicarea acestei metode n cteva situaii practice concrete.

1. PREZENTARE TEORETIC
1.1.ERORI ABSOLUTE I ERORI RELATIVE
Deoarece valoarea msurat sau calculat a unei mrimi nu reprezint valoarea adevrat sau exact a mrimii, o numim valoare aproximativ. Definiia 1.1. Numim eroare diferena dintre valoarea adevrat (exact) i valoarea aproximativ. Matematic definiia poate fi exprimat prin formula:
ex = x - x ,

(1.1)

unde:
ex reprezint eroarea, x valoarea adevrat, x valoarea aproximativ.

Deoarece unii autori definesc eroarea ca diferena: ex = x - x ,

(1.2)

pentru a reuni cele dou definiii ale erorii ntr-una singur s-a trecut la definirea erorii absolute, astfel:
ex = x - x

Definiia 1.2. Numim eroare relativ raportul dintre eroarea absolut i valoarea aproximativ absolut: e x = |ex /x | (1.3)

ndrumar de laborator pentru Metode Numerice

2. REPREZENTAREA GENERAL A NUMERELOR REALE


2.1.FORMA GENERAL A UNUI NUMR REAL. ENTITILE CONSTITUTIVE ALE ACESTUIA.
Un numr real se reprezint sub forma urmtoare:
nrReal = mantisa * baza
exponent

(1.4)

Mantisa se mai numete i fracie, i este un numr real. Exponentul este un numr ntreg, deci poate fi sau nu interpretat cu semn. Exist i o reprezentare a numerelor reale de forma:
nrReal =

unde:

d0.d1d2d3dp-1

* be

(1.5)

- mantisa, const din poziiile di, n numr de p poziii; - baza este notat prin b; - exponentul este notat prin e. Cele dou notaii sunt echivalente. Cea de-a doua prezint n detaliu construcia mantisei, pe cnd prima notaie este mai direct, i arat entitile principale ce alctuiesc un numr real.

2.2.CONVENII DE REPREZENTARE
O cifr n reprezentarea n baz 2 se numete bit, i va fi notat n text prin litera b minuscul. Entitatea format din 8 bii consecutivi se numete octet (byte n limba englez) i va fi referit n text prin litera B, majuscul. n reprezentrile din memorie ale celor dou entiti (n spe mantisa i exponentul), fiecare poziie binar va fi reprezentat folosind simbolurile: - F, de la fracie, pentru fiecare dintre biii mantisei; - E, de la exponent, pentru fiecare dintre biii exponentului. - S, de la semn, pentru bitul de semn.

Erori n operaiile algebrice

3. DIMENSIUNILE TIPURILOR REALE FUNDAMENTALE


3.1.SPAIUL DE MEMORIE
Orice tip de variabil are sens ntr-un limbaj de programare dac exist n memorie. Deci dac are asociat un spaiu de reprezentare. Spaiul de reprezentare, din punct de vedere binar, este format din bii. Care se grupeaz n octei. Spaiul minim adresabil este octetul. Limile n bii/octei pentru fiecare tip de dat fundamental C sunt stabilite prin standard (v. standardul ISO/IEC 9899:1999). n discuia de fa este important cui atribuim / alocm aceti bii, referindu-ne la mantis, baz i exponent. Din punct de vedere hardware baza de reprezentare este 2 (sistemul de numeraie binar). Celelalte baze de numeraie uzual folosite n domeniul informatic sunt: - octal (baza 8) ; - hexazecimal (baza 16). La ecran (i deci nu n memorie) o afiare fcut pentru un utilizator obinuit (utilizatorii diferii de cei specializai, precum programatori sau depanatori) va fi n sistemul de numeraie zecimal (baza 10). Pentru a reui astfel de afiri trebuie parcurse etape de conversie, care aduc numrul binar n echivalentul su dorit (zecimal/octal/hexazecimal). n concluzie, pentru baza de numeraie nu se va rezerva spaiu de memorie: aceasta este 2 i rmne neschimbat (nu se poate schimba baza de numeraie pe parcursul calculelor, n func ie de situaii convenabile, pentru c dac s-ar recurge la aa ceva, caracterul unitar al prelucrrilor s-ar pierde, generndu-se confuzii). n plus, nu exist dispozitive hardware n logic multipl (deci care s foloseasc diferite baze de numeraie). Rmn de analizat mantisa i exponentul, pentru care evident exist un numr de bii specifici, n funcie de tipul de dat real folosit.

3.2.ECHIVALENA NTRE DENUMIRILE TIPURILOR REALE PREZENTE N STANDARD I CELE ADOPTATE DE LIMBAJELE C/C++
Standardul numete trei tipuri de date reale: - simpl precizie; - dubl precizie; - precizie extins.

ndrumar de laborator pentru Metode Numerice

Limbajul C/C++ are un echivalent pentru fiecare. Aceste echivalene sunt, respectiv:
float double long double

Spaiul de memorie stabilit prin standardul ANSI C (ISO/IEC 9899:1999), difereniat pentru fiecare dintre entitile mantis i exponent este urmtorul: - float 4B = 32b repartizai astfel: o 23b pentru mantis; o 8b exponentul, care pe poziia MSb conine semnul; o 1b pentru semnul mantisei, deci semnul numrului real ca atare. - double 8B = 64b, repartizai astfel: o 52b pentru mantis; o 11b pentru exponent; o 1b pentru semnul mantisei, deci semnul numrului real. - long double 10B = 80b (denumit i ten bytes) o 64b pentru mantis; o 15b pentru exponent; o 1b pentru semnul mantisei, deci semnul numrului real. Folosind notaiile simbolice anunate n seciunea Convenii de reprezentare, vom detalia aezarea n memorie a celor 32 de bii ai tipului float. Astfel, pentru acest tip de dat, i prin generalizare i pentru celelalte dou, n memorie exist urmtoarea aezare a biilor:
31

S | E EEE EEE E | F FFFFFFFFFFFFFFFFFFFFF F


Am marcat spaierea dintre fiecare grup de bii printr-o bar vertical. Deasupra poziiilor importante am marcat indexul (puterea bazei) asociat acelei poziii. Plecnd din dreapta, indexul biilor crete. Primul bit din dreapta are indexul zero, i este denumit bitul cel mai puin semnificativ (Least Significant Bit), iar primul bit din stnga cum privim aezarea de ansamblul a biilor, poart denumirea de bit cel mai semnificativ (Most Significant Bit). Bitul LSB are utilitate de exemplu n determinarea paritii numerelor reprezentate n baza 2. Bitul MSB este convenional asociat semnului, anume: - 0, pentru numerele pozitive; - 1, pentru numerele negative.

30

23

22

Erori n operaiile algebrice

3.3.INTERPRETAREA GAMEI ASOCIATE FIECRUI TIP DE DAT REAL


La prima vedere, pentru tipurile reale float i double se respect dubla precizie: tipul double are de dou ori mai muli bii dect float. Privind mai atent ns, acest lucru este ndeplinit i oarecum depit, n sensul urmtor: la tipul double, pentru mantis, dubla precizie ar fi cerut un numr de 46b, dac interpretarea se face n sens strict. ns, fiind vorba de baza 2, se tie c orice bit luat n considerare n reprezentare, conduce automat la dublarea gamei. Diferena de bii ntre cele dou cantiti este de:
52b - 23b = 29b

Aceasta este considerabil dac avem n vedere afirmaia c fiecare bit dubleaz gama. Cu 29b spaiul ctigat n reprezentarea numerelor reale este:
2
29

= 29 * 220 = 256 Mega,

deci 256 milioane de combinaii suplimentare. i pentru exponent situaia este mulumitoare, pentru c nu avem strict 1b n plus (care ar duce efectiv la dublarea gamei), ci avem 3b suplimentari, aadar o operaie de dublare a gamei repetat de 3 ori.

3.4.SPECIFICATORII DE FORMAT
Pentru fiecare dintre tipurile de date reale, limbajul C rezerv urmtoarele combinaii de litere:
float: %f double: %lf long double: %Lf

Dei sunt tipuri de date compatibile, recomandarea n practic este s se foloseasc specificatorii asociai fiecruia dintre tipuri. n caz contrar, funciile de citire/scriere a datelor fiind instruite ntr-un anumit sens, datele de intrare sosesc n alt sens, i de aici rezultatele calculelor pot fi neateptate, sau mai grav, nedeterminate.

ndrumar de laborator pentru Metode Numerice

4. VALORI LIMIT N REPREZENTAREA NUMERELOR REALE


4.1. REPREZENTRILE PSEUDO-NUMERELOR: zero, infinit i NaN

Dup cum am anunat n seciunea Convenii de reprezentare vom folosi mai jos acele notaii simbolice, pentru fiecare dintre poziiile binare ale mantisei i exponentului, n reprezentarea unor numere speciale pentru mulimea R: zero, infinit i NaN (Not a Number). Sunt date mai jos reprezentrile binare ale acestor situaii speciale, cu observaia c s-a presupus tipul real simpl precizie (float n C), pentru a oferi expunerii un caracter comprehensiv. n cele din urm nu spaiul este esenial, ci modul de repartiie al biilor pentru fiecare entitate component a numrului real.

31 0 0 = 31 1 31 0 = 31 1

30 30

0 000000 0 0 000000000000000000000 0
23 22 0

23 22

0 000000 0 0 000000000000000000000 0
23 22 23 22 0 0

30 30

11111111 0 0000000000000000000000 11111111 0 0000000000000000000000

23 22 0 31 30 0 11111111 0 0000000000000000000001 NaN = ................. 31 30 23 22 0 1 11111111 11111111111111111111111

Se pot face cteva observaii, pe baza reprezentrilor de mai sus: - toate cele trei reprezentri sunt obligatoriu duale (pozitive i negative); - n valoare absolut, NaN l depete pe + (cum am spune la dreapta lui + ), iar -NaN este ca valoare sub cea a lui - (la stnga lui - ); - cnd exponentul are toate poziiile pe 1 binar, atunci indiferent de valoarea mantisei se obine o reprezentare rezervat: fie infinit, fie NaN; aceasta demonstreaz c exist o gam ntreag pe care standardul o rezerv acestor reprezentri (datorat valorilor mantisei). Relativ la ultima observaie, merit s reprezentm exponentul pentru cele dou situaii, i s-l reprezentm n baza 10. Valorile pe care le vom descoperi dau limitele superioar i inferioar ale exponentului numerelor reale, i sunt importante n gsirea valorilor limit inferioar i superioar. n paragraful urmtor detaliem acest lucru.

Erori n operaiile algebrice

4.1.1. INTERPRETAREA EXPONENTULUI AVND TOATE POZIIILE PE VALOAREA 1 BINAR Reprezentarea pe 8b cu toate valorile 1 binar poate avea o semnificaie dubl n baza 10, n funcie de cum considerm util bitul de semn (MSb-ul reprezentrii binare). Fr semn, avem utile n reprezentare toate poziiile, deci 8b. Aceasta conduce ctre valoarea zecimal 255. Bitul LSb este pe 1, deci numrul binar este impar. Cu semn, numrul de bii utili este 7. Semnul este dat de MSb, i cum el este 1 numrul este negativ. Pentru cele 7 poziii, cum LSb este 1 rezult c numrul obinut trebuie s fie impar. Obinem: -127. Aceste valori trebuie reinute, avnd n vedere discuia de la reprezentarea normalizat. Acolo polarizarea se alege astfel nct s aduc n zero cel mai mic exponent negativ. Vedei seciunea Reprezentarea normalizat pentru mai multe detalii.

4.2.

GAMA REZERVAT PSEUDO-NUMERELOR

Se poate observa c atunci cnd exponentul are pentru toi biii valoarea 1, indiferent de valorile bi ilor mantisei, compilatorul va trata acea reprezentare drept o excepie: sau infinit, sau NaN. Aceasta arat c, pentru cazul n care exponentul are to i bi ii 1, pentru tipul float, cu cele 23 de poziii ale mantisei se obin 223 combinaii care nu pot fi utilizate n program. Apare un 'decupaj' din gama total pentru numerele reale, decupaj care se refer exclusiv la situaii imposibil de folosit n practic. Pornind de la aceast situaie, gama de reprezentare rmas nu prezint dezavantaj n sensul limitrii posibilitilor de reprezentare.

4.3.

EXEMPLE DE SITUAII PRACTICE N CARE APARE FIECARE DINTRE REPREZENTRILE SPECIALE

Zero este un numr uzual. Putem spune c poate aprea n mod normal ntr-o situaie practic, fr s constituie o situaie excepional. Poate fi folosit fr restricii. Trebuie ns avute n vedere sunt situaiile n care acest numr apare la numitorul unei fracii. Dac aceste cazuri nu sunt tratate corespunztor, rezultatul calculelor nu mai poate fi prezis cu acurate e, dat fiind contextul variabil n care o asemenea situaie poate aprea. Infinit este deja o reprezentare ce nu poate fi folosit n mod normal ntrun caz practic. Dac am ncerca s stabilim manual biii unei variabile, astfel nct ei s corespund celor prezentai, n momentul n care ncercm s

ndrumar de laborator pentru Metode Numerice

folosim n mod obinuit acea variabil, rezultatul va fi semnalat de ctre compilator. NaN este o reprezentare pur convenional a situaiilor speciale. Este ntradevr un pseudo-numr. De exemplu, situa ia unei nedeterminri de tip 0/0 este modelat n standard prin NaN. Sau alte situaii similare: infinit la zero, zero la zero etc. De exemplu, se poate fora afiarea la ecran a acestei reprezentri din partea compilatorului, prin simularea unei limite care genereaz o nedeterminare:

sin( x ) lim = NaN x0 x


sau prin calculul unei fracii ai crui numitor i numrtor sunt ambii stabilii la zero. Pentru detalii consultai desfurarea lucrrii, seciunea Probleme de laborator, exerciiul 6.

5. REPREZENTAREA NUMERELOR REALE N FORMA NORMALIZAT


5.1. DENUMIREA DE NOTAIE TIINIFIC

Numerele reale se pot reprezenta n dou variante: - normalizat; - nenormalizat. Utilitatea major o are reprezentarea normalizat. n aceast notaie numerele foarte mari ca i cele foarte mici nu-i pierd semnificaia i valoarea, i pot fi interpretate ca ordin de mrime. De exemplu, pentru a face distincia dintre cele dou moduri de reprezentare anunate, s alegem numrul urmtor:
0.0000000001|10

Dup cum se poate uor observa, acest numr este foarte mic, n spe foarte apropiat de 0. Prima cifr diferit de zero a mantisei apare pe poziia a 10-a. Aceasta nseamn c, pentru a putea fi folosit ca o entitate diferit de zero, rezoluia de reprezentare trebuie s fie de cel puin 10 zecimale. Ca o consecin a acestui fapt, ar trebui ca i aparatele folosite n msurarea unei astfel de mrimi s permit rezoluii foarte bune. Cum n mod obinuit aplicaiile folosesc de obicei maximum 6 zecimale exacte, acest numr va fi considerat zero (urmare operaiei de rotunjire, n care se pstreaz doar zecimalele utile).

Erori n operaiile algebrice

Aici intervine reprezentarea normalizat, n care numrul de mai sus nu-i va pierde valoarea, putnd fi interpretat ca un numr foarte mic, dar nu zero. Scrierea sa echivalent folosind reprezentarea normalizat este:
1.2 * 10-10

dac considerm c este reprezentat n baza 10. n acest moment, numrul nu mai este zero, ba chiar mai permite nc 5 poziii zecimale, dac am considera o reprezentare cu 6 zecimale exacte. 5.2. UTILITATEA REPREZENTRII NORMALIZATE

Avantajul reprezentrii normalizate este acela de a permite comparaia numerelor foarte mari sau foarte mici, fr a pierde din vedere poziiile utile (cele diferite de zero) care pot aprea, pentru numerele foarte mari dup multe poziii de zero n dreapta cifrei utile, iar pentru numerele foarte mici dup multe poziii de zero n stnga cifrei utile. Denumirea echivalent a reprezentri normalizate n limbajul matematic obinuit este notaie tiinific, sau notaie n puteri ale lui 10. Prima denumire este cea uzual. Putem considera dou exemple sugestive de numere, care fr apel la reprezentarea normalizat (notaia tiinific) nu ar avea sens n calcule. Primul exemplu este sarcina electronului: 1.60217646 10-19 coulombs. Este binecunoscut aceast reprezentare din problemele de fizic, i nu numai. Al doilea exemplu este numrul lui Avogadro: NA = 6.0221415 * 1023. Acest numr este foarte utilizat n problemele de chimie. Dup cum se observ, reprezentrile au sens i sunt natural interpretate prin intermediul notaiei tiinifice. n concluzie, pentru o reprezentare nenormalizat, aceste numere ar fi, presupunnd un numr de zecimale impus, fie zero (pentru sarcina electronului) fie o valoare limit superioar conform gamei de reprezentare aleas, pentru numrul lui Avogadro.

5.3.

REGULILE DE REPREZENTARE IMPUSE DE FORMA NORMALIZAT

Pentru a putea folosi reprezentarea normalizat, trebuie s respectm urmtoarele reguli, referitoare la mantis i la exponent. Aceste reguli nu in de baza de reprezentare. Regulile prezentate mai jos trebuie respectate n ordinea menionat, deoarece schimbri ale valorilor mantisei influeneaz exponentul, i nu viceversa. Aadar: 1) Regula pentru mantis - cere ca aceasta s fie situat n intervalul:
[1, baza)

10

ndrumar de laborator pentru Metode Numerice

2) Regula pentru exponent - cere ca exponentul s fie reprezentat fr semn n memorie. Pentru a putea fi reprezentat fr semn, o valoare de exponent ntlnit n mod obinuit n calcule va trebui convertit ntruna fr semn folosind ceea ce se numete polarizare (bias) n standardul IEEE754. Polarizarea este un numr special ales pentru fiecare form de reprezentare real (simpl, dubl i precizie extins) astfel nct s aduc n 0 valoarea cea mai mic cu semn a exponentului n reprezentarea din acea baz. Valoarea polarizrii se calculeaz cu relaia: bias = 2nrBitiExponent-1 -1 (1.6) Rezult urmtoarele valori, pentru fiecare tip real posibil: - simpl precizie (float): bias = 2 8-1 -1 = 127 dubl precizie (double): bias = 2 11-1 -1 = 1023 - precizie extins (long double): bias = 2 15-1 -1 = 16383 De exemplu, numrul 10 n baza 10 se scrie n reprezentarea normalizat drept:
+1.0 * 101

Observaii: 1) Exist dou reprezentri distincte presupuse de standard, i respectate i n limbajul C: a. reprezentarea intern a unui numr, fiind vorba despre o reprezentare n memorie; b. reprezentarea extern a unui numr real, aici fiind vorba despre o reprezentare la ecran. Cele dou reprezentri sunt echivalente, dar se fac n mod diferit. 2) Polarizarea este un numr impar. Vom da n urmtoarele dou paragrafe dou exemple de calcul care sunt foarte utile n nelegerea mecanismelor care stau la baza funcionrii unei reprezentri n virgul mobil: - conversia unui numr real din baza 10 n baza 2; - conversia unui numr real din baza 2 n baza 10; 5.3.1. REPREZENTAREA UNUI NUMR REAL BINAR N FORM NORMALIZAT PLECND DIN BAZA 10 Plecm de la numrul zecimal: -300.65 |10 Acesta prezint i parte ntreag i zecimal pentru mantis. Partea zecimal sau cea ntreag putea lipsi. Trebuie s convertim cele dou componente ale mantisei, succesiv. ncepem cu conversia prii ntregi.

Erori n operaiile algebrice

11

Dup cum v reamintii, conversia unui numr ntreg din baza 10 n baza 2 se face prin mpriri succesive la 2. Pentru fiecare pas se reine restul mpririi, iar noul demprit se consider ctul determinat la pasul curent. Resturile vor fi n final scrise n ordine invers, astfel nct primul rest gsit devine LSb al reprezentrii binare a numrului. Dac numrul de resturi nu este o putere a lui 2, se vor face completri cu poziii de 0 nspre MSb pentru attea poziii lips pn se ajunge la un numr par, putere a lui 2 (4, 8, 16 etc). Aadar, pentru 300|10 avem succesiunea:

300 2 rest 0 150 2 rest 0 75 2 rest 1 37 2 rest 1 18 2 rest 0 9 2 rest 1 4 2 rest 0 2 2 rest 0 1

Dup cum spuneam, primul rest devine LSb, deci este prima poziie din dreapta, n reprezentarea binar ctre care ne ndreptm. Ultimul rest devine primul bit din reprezentarea binar cutat. Avem:
1 0010 1100

deci o reprezentare pe 9 poziii binare. n mod normal, la stnga primului bit trebuie s completm cu 0 pn gsim un numr de poziii putere a lui 2. Pentru situaia concret prezentat, urmtorul numr de poziii putere a lui 2, ce poate reprezenta dimensiunea unui tip de dat, este 16 (pentru int), deci ar trebui s completm cu poziii de 0, astfel:
0000 0001 0010 1100

unde biii zero scrii nclinat reprezint adugrile noastre. Aceasta este operaia complet de conversie a unui numr ntreg din baz 10 n baz 2. Pentru situaia de fa ns nu vom face completrile cu 0, pentru c aceasta genereaz bii suplimentari, care nu rezult din conversia efectiv, i acest lucru are efecte nedorite n 'economia' biilor pentru reprezentrile reale (v reamintii c fiecare numr real are un numr fix, impus, de poziii binare alocate mantisei). Deci, pentru lucrarea de fa reprezentarea binar considerat nu va conine i adugrile de poziii 0. Aadar, reprezentarea binar final pentru partea ntreag a mantisei este:
1 0010 1100 |2

12

ndrumar de laborator pentru Metode Numerice

Avem pn acum 9 bii din cei 23b ai mantisei (reamintim c exemplele considerate sunt pentru reprezentri simpl precizie, adic float n limbajul C). Urmeaz conversia prii fracionare. Pentru aceasta reamintim c algoritmul de conversie este urmtorul: numrul fracionar iniial se nmulete cu 2. Rezult un nou numr fracionar. Se reine partea ntreag, iar pentru continuarea calculelor se preia partea frac ionar, care se nmulete din nou cu 2. Rezult un nou numr fracionar, pentru care se reine partea ntreag, iar partea fracionar intr n operaia de nmulire cu 2 .a.m.d. Avem, succesiv:
0.65 x 2 = 1.3 0.3 x 2 = 0.6 0.6 x 2 = 1.2 0.2 x 2 = 0.4 0.4 x 2 = 0.8 0.8 x 2 = 1.6 .a.m.d , , , , , , rein rein rein rein rein rein 1; 0, 1, 0, 0, 1, continui continui continui continui continui continui cu cu cu cu cu cu 0.3 0.6 0.2 0.4 0.8 0.6

Continum nmulirile fie pn cnd ntlnim o parte fracionar zero, fie pn numrul de poziii reinute ne este suficient n cazul concret de lucru. Pentru situaia de fa, se observ c nu se poate ca n urma unei nmul iri cu 2 partea fracionar s ajung 0. Astfel, vom continua nmulirile pn contorizm un numr de bii dorit (valorile reinute se observ c sunt doar de 0 i de 1, deci pot fi considerate bii). Cum partea ntreag a mantisei a avut nevoie de 9b, vom continua nmulirile pn cnd 'colecionm' 14b pentru partea fracionar. Grupnd cele dou reprezentri de pn acum (n total 23b) i separndu-le prin punctul flotant, avem: Dup cum s-a artat n seciunea 6.3, mantisa trebuie s aparin intervalului [1,2) dac dorim o reprezentare normalizat. Acest lucru este aici posibil doar dac partea ntreag a mantisei este 1. Pentru aceasta vom muta punctul mobil la stnga pn imediat n dreapta bitului MSb. Noua reprezentare este:
1.0010110010100110011001 100101100.10100110011001

Am deplasat punctul mobil cu 8 poziii la stnga, deci va trebui s nmulim numrul cu 28, pentru ca nimic s nu se schimbe. Deci exponentul este pentru acest caz egal cu 8. Avem:
1.0010110010100110011001 * 28

Pentru c am aflat care este valoarea exponentului, i innd cont c acum facem o reprezentare n memorie, va trebui s polarizm exponentul. innd cont c reprezentm pe gama float, polarizarea este 127. Plecnd de la aceste observaii, n memorie va fi stocat pentru exponent valoarea polarizat:
8 + 127 = 135

Erori n operaiile algebrice

13

Cutm acum reprezentarea binar a lui 135 i aceasta va fi cea memorat. Pentru 135 gsim urmtoarea reprezentare (pe baza algoritmului folosit anterior):
1000 0111|2 = 87|16 = (8*161 + 7*160)|10 = 128 + 7|10 = 135|10

Am marcat pentru fiecare pas baza de numeraie n care s-au fcut reprezentrile de fiecare dat. Exponentul este aici este impar i se vede c LSb este 1 binar (n acest fel am verificat suplimentar rezultatul obinut). Numrul n baz 10 a fost anunat ca -300.65, adic un numr negativ. Pentru aceasta va trebui ca MSb al reprezentrii binare din memorie s fie 1. Avem toate datele pentru a putea da reprezentarea binar final a numrului zecimal propus, pentru gama de reprezentare float. Aceasta este:
31 30

1 1 0000111 1 0010110010100110011001

23

22

Ca i n prezentarea teoretic am marcat i indicii poziiilor binare importante a le numrului. Observaii: 1) Fiind vorba despre o discuie n sistem binar, regula pentru mantis pentru reprezentarea normalizat impune acesteia s aparin intervalului [1, 2). Acest lucru este posibil dac i numai dac partea ntreag este 1|2. Orice bii am avea pentru partea fracionar, chiar i toi de 1|2, tot nu se reuete atingerea unitii. Aceasta pentru c n partea dreapt a punctului zecimal sunt puterile negative ale lui 2, deci o sum de puteri negative ale lui 2, adic a unor numere subunitare, care nu poate atinge valoarea 1|10. 2) Pentru c se lucreaz n form normalizat, deci mantisa aparine obligatoriu intervalului [1, 2) se poate ca primul bit din stnga al mantisei, cel de index 22, s nu mai fie memorat. Acesta se numete hidden bit i este presupus implicit. Fr el mantisa nu ar mai aparine intervalului indicat. Deci se poate c tiga 1b n reprezentarea numrului, ceea ce poate fi important atunci cnd avem un numr inexact (reprezentat pe un numr infinit de poziii ntr-o anumit baz). 3) Ca un corolar al observaiei 2), pot exista numere care s aib o reprezentare exact ntr-o baz de numeraie i inexact ntr-o alta. Este i cazul de fa. Din aceast cauz, orice bit ctigat n reprezentarea poate fi important.

14

ndrumar de laborator pentru Metode Numerice

5.3.2. REPREZENTAREA UNUI NUMR REAL ZECIMAL N FORM NORMALIZAT PLECND DIN BAZA 2 Presupunem urmtoarea reprezentare binar ca punct de plecare n conversia reciproc, din baz 2 n baz 10.
1 10000111 00101100000000000000000 |2

Dac presupunem reprezentarea normalizat, nseamn c avem deja presupus bitul ascuns. Prin urmare, ce exist n memorie ca bii ai mantisei reprezint partea fracionar a mantisei:
00101100000000000000000

ce va trebui prefixat cu valoarea acelui bit ascuns, pentru a genera reprezentarea complet a mantisei.
1.00101100000000000000000

5.4.

ECHIVALENA N LIMBAJUL C A REPREZENTRII NORMALIZATE

Dup cum ne-am propus, prezentarea se face n paralel ntre standard i limbajul C. Spuneam c limbajul respect standardul. Astfel, pentru acest moment al prezentrii vom explica cum se poate fora o afiare n notaie normalizat (format tiinific) a valorilor reale folosite n calcule. Pentru C, funciile de citire/afiare de la consol (tandemul tastatur + ecran) permit i interpretarea numerelor reale n reprezentare normalizat. Vom denumi aceast reprezentare notaie tiinific. Aadar, n limbaj exist posibilitatea afirii datelor la ecran sub forma normalizat folosind unul dintre specificatorii de format %e sau %E. Diferena ntre acetia este doar de form, i nu de fond. Pentru prima reprezentare, la ecran va aprea litera e minuscul, iar n cea de-a doua litera E majuscul. Exemplu: 1) Pentru numrul 1234.567, notaia tiinific se obine n C astfel:
float varR = 1234.567; printf("\n Notatia stiintifica: %e", varR); Rezultatul este: 1.234567e+3 Pentru numrul 123456.789 se poate afia formatul varianta cu %E: float varR = 123456.789; printf("\n Notatia stiintifica: %E", varR); Rezultatul este: 1.23456789E+5

2)

tiinific i n

Se poate vedea c rezultatele sunt similare, doar simbolul afiat este diferit.

Erori n operaiile algebrice

15

6. CIFRE SEMNIFICATIVE
6.1. DEFINIIA UNEI CIFRE SEMNIFICATIVE

Acea cifr care nu poate lipsi (nu poate fi ignorat) din reprezentarea unui numr real poart numele de cifr semnificativ. Problema este mai delicat mai ales cu cifrele aflate pe ultimele poziii, privind de la stnga la dreapta. i n mod special pentru cifrele de zero situate n aceste poziii extreme.

6.2.

CIFRELE DE ZERO SEMNIFICATIVE N REPREZENTARE NORMALIZAT I NENORMALIZAT

Dac numrul este n reprezentare ne-normalizat, deci digitul d0 este zero, atunci se poate spune c acea poziie poate lipsi, pentru c exist o reprezentare n care acea cifr nu mai apare - anume reprezentarea normalizat v. seciunea Reprezentarea numerelor n forma normalizat. n mod normal, se poate ignora o cifr doar dac este ntr-una dintre extremitile numrului. i trebuie inut obligatoriu seama de regulile implicate n aceast decizie.

6.2.1. CIFRA SITUAT LA NCEPUTUL NUMRULUI


Astfel, n reprezentarea nenormalizat, mantisa ncepe sigur cu o poziie zero, n stnga punctului zecimal. Aa cum am spus n paragraful anterior, n aceast situaie acea cifr poate fi ignorat, pentru c exist o reprezentare echivalent ce nu cuprinde i acea poziie. Informaia pe care acea cifr o ofer este asupra modului n care trebuie fcut translaia punctului zecimal, deci se reflect n valoarea exponentului. Este jocul care trebuie avut n vedere de fiecare dat: translaia punctului zecimal influeneaz mrimea numrului real, deci are influen asupra exponentului.

6.2.2. CIFRA SITUAT LA SFRITUL NUMRULUI


O cifr zero situat pe prima poziie din dreapta numrului se poate ignora, pentru c nu are vecin n dreapta sa. Aceast operaie ns nu se face fr efecte. Ignorarea unei cifre n situaia aceasta are dou consecine: - pierderea n reprezentare a unui ordin de mrime (discutm acest aspect n contextul bazelor de numeraie poziionale); - ignorarea eventualelor operaii anterioare, care au determinat forma curent a numrului, i care este posibil s fi presupus deja operaii de trunchiere/rotunjire. Dac se alege nlturarea ultimei cifre se ignor n

16

ndrumar de laborator pentru Metode Numerice

mod direct aceste operaii. n cele din urm acele presupuse operaii se pot repeta, dar de aceast dat pentru un numr mai redus de zecimale, pentru c prin ndeprtarea cifrei finale, trebuie avute n vedere regulile tandem pentru trunchiere/rotunjire - v. seciunea Rotunjiri obinuite. Aadar, n situaiile practice n care o astfel de situaie apare, nu trebuie s nlturm cifra situat pe ultima poziie (n citirea numrului de la stnga la dreapta, ultima poziie este prima din dreapta).
2.560

De exemplu, s considerm situaia numrului urmtor:

pentru care dorim nlturarea ultimei cifre, acel 0 care nu mai are vecin n dreapta sa. Care ar fi consecinele? Numrul acesta este preluat ca atare de ctre noi, fr a-i cunoate istoria. Acest numr ar fi putut fi n prealabil supus unor operaii de rotunjire/trunchiere, n urma crora a cptat valoarea de fa. Astfel, altcineva ar fi putut deja aplica rotunjirea la 3 zecimale, pornind ns de la numrul:
3.5597|10

Conform regulilor de rotunjire/trunchiere, dac dorim 3 zecimale exacte pentru numrul 2.5597 obinem chiar 2.560. n acest caz, ignorarea din partea noastr a cifrei 0 din final ar da peste cap o operaie anterioar, pentru care putem presupune c s-a avut n vedere un motiv oarecare. De asemenea trebuie reinut din exemplul prezentat c operaia de trunchiere are rol important n reprezentarea datelor. Vom vedea mai concret acest lucru cnd discutm despre rotunjirile obinuite - v. sec iunea Rotunjiri obinuite.

7. ROTUNJIRI OBINUITE
Se fac prin comparaia fa de 5 a cifrei ce urmeaz s fie nlturat. n aceast operaie apar i cteva situaii la limit, n care foarte important este cantitatea ce trebuie trunchiat. Primul pas ntr-o operaie de rotunjire este trunchierea. Astfel, dac numrul de zecimale din reprezentarea dat este mai mare dect cel avut n vedere n rotunjire, atunci toate cifrele din acea reprezentare ncepnd cu cifra din dreapta celei care va trebui comparat cu 5 vor fi ignorate. Aceast cifr ce urmeaz s fie comparat cu 5 este absolut necesar rotunjirii. Odat comparaia ncheiat aceast cifr va fi la rndul su ignorat. Tocmai aceast trunchiere trebuie avut n vedere n rotunjire. Nu putem ignora pur i simplu zecimalele suplimentare. Trunchierea are o influen concret i foarte important asupra valorii finale a numrului de rotunjit.

Erori n operaiile algebrice

17

Pentru a aplica rotunjirea vom studia cteva exemple concrete, care acoper toate situaiile reale. Numerele pe care dorim s le rotunjim sunt:
4.3244 4.3236 4.3275 4.3285

Ultimele dou constituie cazuri limit. Vom vedea imediat despre ce este vorba. Am marcat n aldin cifra ce urmeaz s fie comparat cu 5. Orice alte zecimale situate n dreapta sa vor fi trunchiate. Putem avea o parte trunchiat diferit sau egal cu 0. Pentru al doilea caz rotunjirea ine cont de o convenie. S ncepem cu primul numr. Trunchiem aadar toate zecimalele situate n dreapta cifrei marcat n aldin (ngroat). Iar aceast cifr o comparm cu 5. Fiind mai mic, avem de-a face cu o rotunjire prin lips, aa cum ne va arta i eroarea de rotunjire. In urma acestui tip de rotunjire lsm neschimbat valoarea digitului din stnga celui cu care facem comparaia cu 5. De fapt nlturm o anumit valoare astfel nct ultima cifr a numrului s devin 0. Deoarece dorim evident rotunjirea vom ignora fr probleme acea cifr (vedei i paragraful 6 - Cifre semnificative pentru mai multe detalii privind renunarea la o cifr 0 situat pe ultima poziie a unui numr real). Am pus un semn minus n dreapta rezultatului calculat n valoare absolut pentru a reine aspectul men ionat: avem de-a face cu o rotunjire prin lips. Valoarea nlturat este dat de diferena de mai sus. Pentru al doilea numr. Trunchiem aadar toate zecimalele situate n dreapta cifrei marcat n aldin. Comparm cifra rmas cu 5. n acest caz este mai mare dect 5 i vom aplica rotunjirea prin adaos. Valoarea digitului anterior celui intrat n operaia de comparare cu 5 va crete cu o unitate. Aceasta provine din faptul ca de fapt adugm o anumit valoare astfel nct ultima cifr a numrului s devin 0. Cum ceea ce dorim este rotunjirea vom putea ignora fr probleme acea cifr (vedei i paragraful 6 - Cifre semnificative pentru mai multe detalii privind renunarea la o cifr 0 situat pe ultima poziie a unui numr real). Am pus un semn plus n dreapta rezultatului calculat n valoare absolut pentru a reine aspectul menionat: avem de-a face cu o rotunjire prin adaos. Valoarea adugat este dat de diferena de mai sus. Pentru ultimele dou situaii exist o nuan suplimentar ce trebuie avut n vedere: valoarea prii trunchiate. Anunam acest lucru mai sus. Aadar, sunt dou situaii: valoare diferit de zero SAU valoare nul. Pentru prima situaie, indiferent de paritatea cifrei anterioare celei cu care facem comparaia, rotunjirea se face prin adaos.
4.3236 -> 4.324, err = |nrRotunjit - nrInitial| = |0.0004|+ 4.3244 -> 4.324, err = |nrRotunjit - nrInitial| = |0.0004|-

18

ndrumar de laborator pentru Metode Numerice

n schimb, dac partea trunchiat este zero, atunci inem cont de convenia care spune c dac paritatea cifrei anterioare celei care ajut n comparaia cu 5 este impar rotunjirea se va face prin adaos. Iar n cazul unei pariti pare rotunjirea se face prin lips. Considernd parte trunchiat diferit de zero rezultatele finale ale rotunjirii sunt:
4.3275 -> 4.328, err = |0.0005|+ 4.3285 -> 4.329, err=|0.0005|+

Aceast convenie mai poart numele i de convenia digitului impar, marcnd prin aceast denumire situaia in care se aplic rotunjirea prin adaos. Observaii: 1) Aplicarea conveniei digitului impar are fundamentare n experimentele de laborator. Justificarea sa este legat de eroarea de rotunjire pe ansamblu. Anume, dac observm c printre simbolurile reprezentrii zecimale avem attea cifre pare cte impare aceasta nseamn c per ansamblu, dac inem cont de aceast convenie, eroarea calculelor ce implic rotunjirile se compenseaz i tinde la 0. Acest lucru avantajeaz calculele intense. Pentru acele situaii nu avem studiat o statistic (sau o distribuie oarecare) prin care s putem justifica probabilitatea de apariie a simbolurilor impare n defavoarea celor pare sau reciproc. Doar eventualele erori de calibrare ale aparatelor de msur folosite pot determina deviaii de aceast natur. Pentru primele dou exemple de rotunjire se observ c rezultatul final este acelai, dei eroarea este diferit. Aadar nu putem spune dinainte ce fel de rotunjire s-a aplicat dac avem un numr dat. Compilatorul de C nu respect convenia digitului impar. Pentru cazurile limit amintite mai sus acesta va ine cont de paritateaimparitatea digitului anterior cifrei comparate cu 5, doar ca tehnica utilizata pare oarecum complementara conventiei prezentate, in sensul ca va rotunji prin adaos daca digitul este par si prin lipsa pentru digit impar. Se poate verifica acest lucru rulnd urmtorul scurt program:

2) 3)

/*Rotunjirea obisnuita - cazuri limita*/ #include<stdio.h> int main() { float nr1=4.3275, nr2=4.3285;

/*impun reprezentare cu 3 zecimale*/ printf("Rotunjire la limita -> nr1: %.3f, nr2:%.3f\n",nr1,nr2); scanf("%f", &nr1); return 0; }

Erori n operaiile algebrice

19

4)

5)

Numrul implicit de zecimale folosit n reprezentrile numerelor reale n ANSI C este 6. Putei observa acest lucru dac se renun la limitrile de reprezentare din programul anterior (construc iile %A.Bf) Exemplele alese anterior pentru situaiile limit n contextul operaiei de rotunjire, justific faptul c eroarea maxim de rotunjire este 5*10-t, unde t reprezint numrul de zecimale pe care-l are un anumit numr ulterior trunchierii i anterior operaiei de rotunjire. Avem aici i legtura cu paragraful urmtor, n care sunt studiate grafurile de procedur. Acolo, operaia de majorare n calculul erorilor expresiilor este determinat unilateral chiar de valoarea 5*10-t.

8. GRAFURI DE PROCEDUR
Aceste grafuri sunt binare, adic ntr-un nod intr cel mult dou mrimi i iese o singur mrime. Pentru fiecare operaie aritmetic marca grafului se calculeaz diferit. Marca grafului pentru operaia de adunare este raportul ntre valoarea din nodul care se nsumeaz i suma valorilor din nodurile care se nsumeaz, procedeul fiind prezentat prin graful din fig.1.1 - Operaia de adunare. Se dau valorile erorilor relative e x i e y ale mrimilor care se nsumeaz i eroarea de rotunjire e r .

Fig.1.1. - Graful operaiei de adunare

Eroarea la ieirea grafului este:


e x+ y =
x y ex + e y + er x+ y x+y

(1.7)

Eroarea relativ propagat prin orice operaie, se calculeaz ca suma produselor erorilor relative ale valorilor care intr n operaie cu marca grafurilor corespunztoare, la care se mai nsumeaz eroarea de rotunjire

20

ndrumar de laborator pentru Metode Numerice

datorat operaiei de adunare. Acest mod de calcul trebuie efectuat pe ntregul graf pn la ieire, obinnd n final eroarea relativ a grafului. Grafurile pot fi mai simple sau mai complexe, funcie de expresia pe care o implementeaz. n fiecare nod al grafului se realizeaz o operaie aritmetic ce are doi termeni sau facto operaie aritmetic care are doi termeni sau factori. Eroarea n nodul grafului se calculeaz dup modul expus anterior i nodul poate deveni la rndul su un termen sau un factor al urmtoarei operaii. n calculul erorii se ine seama de valoarea obinut n fiecare nod prin operaia corespunztoare expresiei a crei valoare a erorii relative o calculm, pentru a determina marca ramurii grafului. Pentru operaiile de nmulire, mprire i ridicare la putere marca grafului este constant indiferent de valoarea obinut n nodul grafului. Marca grafului pentru desczut la operaia de scdere se calculeaz ca raportul ntre valoarea desczutului i diferena valorilor desczutului i scztorului, iar pentru scztor se calculeaz ca raportul dintre valoarea scztorului i diferena valorilor desczutului i scztorului, luat cu semnul minus. Eroarea la ieirea grafului este dat n formula (1.8), iar graful este prezentat n fig. 1.2.

e x-y =

y x ex e y +er x-y x-y

(1.8)

Fig.1.2. - Graful operaiei de scdere

Marca grafului pentru opera ia de nmulire este totdeauna constant egal cu unitatea att pentru nmulitor ct i pentru denmulit. Graful pentru aceast operaie este prezentat n figura 1.3. Eroarea la ieirea grafului este dat de expresia urmtoare:

e xy = e x + e y + e r

(1.9)

Erori n operaiile algebrice

21

Fig.1.3. - Graful operaiei de nmulire

Marca grafului pentru operaia de mprire este totdeauna constant, avnd valoarea 1 pentru demprit i -1 pentru mpritor. n figura 1.4 este prezentat graful pentru operaia aritmetic de mprire. Eroarea la ieirea grafului este:

e x/ y = e x - e y + er

(1.10)

Fig.1.4. - Graful operaiei de nmulire

Operaia de extragere a rdcinii ptrate are marca grafului constant egal cu i este prezentat n figura 1.5.

Fig.1.5. - Graful operaiei de extragere de rdcin ptrat

Eroarea mrimii la ieirea grafului este:

= (1 / 2)e x + e r

(1.11)

22

ndrumar de laborator pentru Metode Numerice

Pentru uurina calculului mrcilor grafului se ine seama de modul de calcul prezentat anterior pentru fiecare operaie aritmetic. Cunoscnd erorile relative ale mrimilor care intr ntr-o expresie n care avem operaiile de baz ale aritmeticii, putem s determinm eroarea final a expresiei cu ajutorul grafurilor de procedur.

9. CONCLUZII
1. Utilizarea n programe a unui numr de zecimale trebuie s fie dictat prioritar de modul implicit de reprezentare din C (6 zecimale exacte); 2. C nu este un limbaj tiinific (ci unul de uz general) i din acest motiv nu ine cont de convenia digitului impar. Dar totui se comport diferit n cele dou situaii limit, cea n care digitul din stnga celui cu care facem comparaia este par sau impar. Tehnica folosit de acesta pare oarecum opus celei prezentate i s-ar putea numi convenia digitului par (dac avem digit par atunci rotunjirea se face prin adaos); 3. Tipul float ar trebui s fie suficient pentru toate programele acestui laborator. Tipul double este tipul exclusiv al funciilor matematice de bibliotec (biblioteca matematic C este construit exclusiv pe double). Orice argument float al acestor funcii va fi automat promovat la double de ctre compilator. In sfrit, tipul de dat long double este utilizat n coprocesoarele matematice. tiind dimensiunea acestui tip de date nelegem performana obligatorie pe care coprocesoarele trebuie s o ofere. 4. Exist o echivalen strns ntre impunerile standardului i felul n care ANSI C implementeaz aceste cerine; 5. Reprezentrile din program trebuie s aib n vedere situaia practic din acel moment. Astfel, trebuie folosii specificatorii de format tipici fiecrei situaii; 6. Nu trebuie ignorat o cifr de zero situat ultima ntr-o reprezentare real oarecare. Mai general, cifra final din reprezentarea unui numr nu se va ignora; 7. Utilizarea doar a specificatorilor de format asociai fiecrui tip de date (conform cerinelor de limbaj) i evitarea interpretrii acestor tipuri de ctre compilator (chiar i pentru tipurile compatibile, cum sunt cele reale de exemplu, folosirea n tandem a specificatorilor diferii genereaz erori de citire/interpretare/afiare a datelor).

10.

DESFURAREA LUCRRII

10.1 . NTREBRI
1. Unde sunt utile grafurile de procedur?

Erori n operaiile algebrice

23

2. Cum se modeleaz o operaie oarecare prin grafurile de procedur (de exemplu operaia de adunare)? Dar o operaie compus? 3. De ce n grafurile de procedur nu este necesar s cunoatem ordinul de mrime al erorilor operanzilor? 4. Deducei ponderile (valorile asociate arcelor) pentru operaia de scdere. 5. Care este numrul de bii rezervai exponentului pentru reprezentarea real n simpl precizie (float n C)? 6. Care sunt cele dou condiii impuse reprezentrii normalizate? 7. Explicai ce semnificaie are polarizarea n reprezentarea normalizat a numerelor reale. 8. Rotunjii obinuit numerele:
a. 0.30510 b. 0.36500

presupunnd c se cer: dou i apoi trei zecimale exacte, pentru fiecare dintre numere. 9. Aducei la forma normalizat numerele:
a. b. c. d. 809.31 0.05925 x 102 72.090 x 10-2 0.6115 x 10100

10. De unde rezult i ce semnificaie are cantitatea 5x10-t ?

10.2. PROBLEME DE LABORATOR


1. S se determine o limit superioar a erorii relative pentru expresia: E( x ) = ( ax 2 + bx + c ) / ( dx + f ) n punctul x0 tiind c a , b, c, d , f , x0 sunt pozitive i au respectiv erorile relative ea , eb , ec , ed , ef , e x 0 . 2. Fie a un numr pozitiv rotunjit n mod obinuit, iar 3 nu are eroare. Se dau expresiile: u=a+a+a , i v=3a S se arate, cu ajutorul grafurilor de procedur, c marginea erorii relative a lui u este mai mare ca marginea erorii relative a lui v. 3. Se consider expresiile u = a 2 + 2a + 1 i v = ( a + 1) 2 unde a este un numr pozitiv rotunjit n mod obinuit i presupunem c 1 i 2 nu au erori. S se arate c pentru a foarte mare marginile erorii relative a lui u i v devin aproximativ egale iar pentru a foarte mic marginea erorii relative a lui u devine aproximativ de trei ori mai mic dect marginea

24

ndrumar de laborator pentru Metode Numerice

erorii relative a lui v . Numrul maxim de cifre al mantisei admise de calculator este t. S se calculeze marginile erorii relative ale expresiilor date i pentru cazul cnd a este exact. 4. Fie a , b i x trei numere pozitive i exacte. S se traseze grafurile de procedur i s se calculeze marginile erorilor relative de rotunjire pentru expresiile: u = ax + bx 2 , i v = x(a + bx) . S se compare cele dou margini ale erorilor, obinute. S se calculeze marginile erorilor relative i pentru cazul cnd cele trei numere au erori de rotunjire. 5. Se consider un circuit R, L, C alimentat de la o surs U. tiind c frecvena sursei are variaia e f , iar R, L, C au variaiile e R , e L , e c , s se traseze graful impedanei circuitului i s se determine o margine a erorii relative a ei. 6. Exemplificri ale situaiilor speciale pentru numerele reale Ca exemplu s-a construit sursa urmtoare, care cuprinde exemple practice pentru toate situaiile n care apar numerele speciale (pseudonumere) la care ne-am referit.
// Exemple de situatii in care apar numerele reale speciale #include<iostream> #include<math.h> using namespace std; int main() { union sitSpeciala float numerator = float denominator float underSqrt =

{long int nrI; float nrR;} situatie; 0; = 0; -1;

// zero situatie.nrI = 0x00000000; // zero cu plus cout << hex << "\n Calcul eronat... zero 1... " << situatie.nrR; situatie.nrI = 0x80000000; // zero cu minus cout << "\n Calcul eronat... zero 2... " << situatie.nrR; // infinit - cu plus si cu minus cout << "\n Calcul eronat... infinit 1... " << 1/denominator; cout << "\n Calcul eronat... infinit 2... " << 1/-denominator; // NaN - calcul eronat - nedeterminari cout << "\n Calcul eronat... nedeterminare 1... " <<

Erori n operaiile algebrice


numerator/denominator; cout << "\n Calcul eronat... nedeterminare 2... " << sqrt(underSqrt); // final cin >> numerator; return 0; }

25

Vom alege un scurt program, ce presupune utilizarea ambelor tipuri de date (reale i ntregi) pentru a rezolva problema propus. Orice programator va trebui s foloseasc cu atenie tipurile mixte, pentru c este vorba despre spa ii de memorie n principiu diferite, dar mai ales de dou mulimi de numere, n spe Z i R, care nu au o echivalen imediat ntre valorile lor. Va trebui utilizat i mecanismul conversiilor explicite, pentru a garanta pstrarea informaiei, i a evita pierderea acesteia - datorat de exemplu micorrii spaiului de memorie prin trecerea de la real la ntreg. Pentru programul urmtor, compilatorul avertizeaz programatorul asupra unor conversii ntre tipuri de date incompatibile. Aceste avertismente se refer la situaiile n care nu apare operatorul de conversie explicit. Pentru celelalte situaii totul este n regul, pentru c odat ce ntlnete conversia explicit compilatorul presupune c programatorul tie ce face. Avertismentele in i de modul n care este configurat compilatorul, avnd n vedere c se pot impune opiuni n linia de comand n momentul lansrii sale n execuie.
// Tipuri mixte de date #include<iostream> using namespace std; int main() { int nr ; unsigned int nr1; float rez = -2.1;

7. Folosirea simultan n program a tipurilor reale i ntregi

// implicit cu semn // fara semn

// folosirea mixta a tipurilor de date - fara conversie implicita // Numarul intreg este cu semn nr = rez; cout << "\n Fara conversie implicita -> numarul intreg este " << nr; // folosirea mixta a tipurilor de date - cu conversie implicita // Numarul intreg este cu semn nr = (int)rez; cout << "\n Cu conversie implicita -> numarul intreg este " << nr;

26

ndrumar de laborator pentru Metode Numerice


// ============= // folosirea mixta a tipurilor de date - cu conversie implicita // Numarul intreg este fara semn nr1 = rez; cout << "\n Fara conversie implicita -> numarul intreg este " << nr1; // folosirea mixta a tipurilor de date - cu conversie implicita // Numarul intreg este fara semn nr1 = (int)rez; cout << "\n Cu conversie implicita -> numarul intreg este " << nr1; // final program cin >> nr; return 0; }

Compilatorul va avertiza programatorul prin mesajele:

Line 14 [Warning] assignment to `int' from `float' Line 25 [Warning] assignment to `unsigned int' from `float'

Este vorba despre liniile 14 i 25 din program, n care nu apar operatorii de conversie explicit, i se impune unui numr real s fie salvat ntr-un numr ntreg. Astfel de situaii pot uor s fie trecute cu vederea, ceea ce are consecine importante n momentul rulrii programului. Pentru situaia n care numrului real i se impune s fie reinut n spaiul asociat unui numr ntreg scurt (2B), fr a se face apel la conversia explicit, s-ar putea da urmtoarea interpretare opera iei: se pleac de la bitul 0, se numr 16b (adic 2B) i ceea ce rezult este salvat n numrul ntreg. ns nu este vorba despre o trunchiere fizic a biilor mantisei! Rezultatul oferit de compilator n absena conversiei explicite este ntr-adevr eronat, dar pentru situaia n care numrul ntreg este fr semn. Pentru cellalt caz, dei rezultatele sunt similare i cu i fr operatorul de conversie explicit, este indicat ca de fiecare dat s se foloseasc operaia de conversie, pentru c nu se tie ce generaie de compilator este folosit.

10.3.

TEME DE CAS

1. Presupunem c x i y sunt dou numere pozitive rotunjite simetric. S se traseze grafurile de procedur ale expresiilor u = ( x + x + x + x ) y i v = 4 xy i s se arate c marginea erorii relative a lui u este mai mare dect marginea erorii relative a lui v . 2. Se consider expresiile u = a 3 + 3a 2 + 3a + 1 i v = (a + 1)3 unde a este un numr pozitiv rotunjit n mod obinuit i presupunem c 1 i 2 nu au erori. S se calculeze marginile erorii relative a lui u i v pentru a foarte mic i pentru a foarte mare (infinit). Comparai marginile

Erori n operaiile algebrice

27

erorilor relative. Numrul de cifre semnificative a lui a este t. Toate erorile care intervin n calcul sunt mai mici dect eroarea relativa de rotunjire simetric. 3. Se consider circuitul din figura 1.6 in care

R1 = 4.7 kW i tolerana e 1 = 10% , R2 = 6.8kW i tolerana e 2 = 5% , R3 = 7,5kW cu tolerana e 3 = 10% i R4 = 10k cu tolerana 4 = 10%. S se calculeze

erorile relative a rezistenelor. S se deduc formula de calcul a rezistenei echivalente a circuitului ntre punctele A i B. Scriei toate valorile n virgul mobil i considernd c toate erorile sunt mai mici dect eroarea relativ a rotunjirii simetrice determinai eroarea relativ maxim a rezistenei echivalente. Considerai numrul de cifre semnificative a valorilor t = 2.

Fig. 1.6 - Circuitul pentru problema 8

4. Se consider amplificatorul operaional din figura 1.7. Considernd rezistenele R1 = 100kW cu tolerana de e 1 = 10% i R2 = 10 MW cu

tolerana de e 2 = 10% s se determine eroarea maxim a amplificrii. Se calculeaz erorile relative a rezistenelor, se fac calculele n virgul mobil si considerm numrul de cifre semnificative t = 2. A=-

R2 R1

28

ndrumar de laborator pentru Metode Numerice Fig. 1.7 - Circuitul pentru problema 9

BIBLIOGRAFIE
1. 2. 3. 4. 5.
David Goldberg - "What Every Computer Scientist Should Know About FloatingPoint Arithmetic", ACM Computing Surveys, Vol 23, No 1, March 1991, pp 6-48. John R. Hauser - "Handling Floating-Point Exceptions in Numeric Programs", ACM Transactions on Programming Languages and Systems, Vol. 18, No. 2, March 1996, pp. 139-174. Ioan Rusu - "Metode Numerice n electronic - aplicaii n limbaj C", Ed. Tehnic, Bucureti, 1997 "IEEE floating point representations", material disponibil la adresa: http://www.math.frin.edu/~cstone/courses/fundamentals/IEEE-reals.html ***Net - documentaii din diferite surse publice.