Documente Academic
Documente Profesional
Documente Cultură
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.
(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)
(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.
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.
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
30
23
22
Aceasta este considerabil dac avem n vedere afirmaia c fiecare bit dubleaz gama. Cu 29b spaiul ctigat n reprezentarea numerelor reale este:
2
29
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.
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
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.
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.
Se poate observa c atunci cnd exponentul are pentru toi biii valoarea 1, indiferent de valorile biilor mantisei, compilatorul va trata acea reprezentare drept o excepie: sau infinit, sau NaN. Aceasta arat c, pentru cazul n care exponentul are toi biii 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.
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 acuratee, 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
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, situaia 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:
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).
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.
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
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.
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
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 fracionar, 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 nmuliri 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
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 ctiga 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
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.
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.
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.
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.
16
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
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. seciunea 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.
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 menionat: 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
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; }
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 (construciile %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 .
(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
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 =
(1.8)
Marca grafului pentru operaia 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)
21
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)
Operaia de extragere a rdcinii ptrate are marca grafului constant egal cu i este prezentat n figura 1.5.
= (1 / 2)e x + e r
(1.11)
22
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?
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
24
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 =
// 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... " <<
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 spaii 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;
// 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
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 operaiei: 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
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.
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.