În informatică eroarea de rotunjire este diferența dintre rezultatul produs de un anumit algoritm folosind aritmetica exactă și rezultatul produs de același algoritm folosind aritmetica în precizie finită, cu rotunjire. Erorile de rotunjire se datorează inexactității reprezentării numerelor reale, precum și a operațiilor aritmetice efectuate cu acestea. Aceasta este o formă de eroare de . Atunci când se utilizează ecuații sau algoritmi de aproximare, în special atunci când se utilizează un număr finit de cifre pentru a reprezenta numere reale (care în teorie au o infinitate de cifre), unul dintre obiectivele analizei numerice este de a estima erorile de calcul. Erorile de calcul, numite și , cuprind atât erorile de trunchiere, cât și erorile de rotunjire.
Când se efectuează o secvență de calcule cu date afectate de erori de rotunjire, erorile se pot acumula, uneori dominând calculul. În problemele rău condiționate se pot acumula erori semnificative.
Pe scurt, există două aspecte majore ale erorilor de rotunjire implicate în calculele numerice: Capacitatea computerelor de a reprezenta atât mărimea, cât și precizia numerelor este inerent limitată. Anumite calcule numerice sunt foarte sensibile la erorile de rotunjire. Acest lucru poate rezulta atât din considerații matematice, cât și din modul în care computerele efectuează operațiile aritmetice.
Eroarea de reprezentare Eroarea introdusă la reprezentarea un număr folosind un șir finit de cifre este o formă de eroare de rotunjire numită eroare de reprezentare. Iată câteva exemple de erori de reprezentare în reprezentări zecimale:
Notație Reprezentare Aproximare Eroare 0.(142 857) 0,142 857 0,000 000 (142 857)ln 2 0,693 147 180 559 945 309 41... 0,693 147 0.000 000 180 559 945 309 41...log10 2 0,301 029 995 663 981 195 21... 0,3010 0,000 029 995 663 981 195 21... 1.259 921 049 894 873 164 76... 1,25992 0,000 001 049 894 873 164 76... 1,414 213 562 373 095 048 80... 1,41421 0,000 003 562 373 095 048 80... 2,718 281 828 459 045 235 36... 2,718 281 828 459 045 0,000 000 000 000 000 235 36... 3,141 592 653 589 793 238 46... 3,141 592 653 589 793 0,000 000 000 000 000 238 46...
Creșterea numărului de cifre permise într-o reprezentare reduce mrimea posibilelor erori de rotunjire, dar orice reprezentare limitată la un număr finit de cifre va determina în continuare o anumită eroare de rotunjire pentru numerele reale nenumărabile. Cifrele suplimentare utilizate pentru etapele intermediare ale unui calcul sunt cunoscute sub numele de cifre de gardă.
Rotunjirea de mai multe ori poate duce la acumularea erorilor. De exemplu, dacă 9,945309 este rotunjit la două zecimale (9,95), apoi rotunjit din nou la o zecimală (10,0), eroarea totală este 0,054691. Rotunjirea lui 9,945309 la o zecimală (9,9) într-un singur pas introduce o eroare mai mică (0,045309). Acest lucru se poate întâmpla, de exemplu, atunci când software-ul efectuează operațiuni aritmetice în precizie extinsă (x86 virgulă mobilă pe 80 de biți) și apoi rotunjește rezultatul în formatul IEEE 754 virgulă mobilă pe 64 de biți.
Sistemul de reprezentare a numerelor în virgulă mobilă Comparativ cu sistemul virgulă fixă, sistemul virgulă mobilă este mai eficient în reprezentarea numerelor reale, așa că este utilizat pe scară largă în computerele moderne. În timp ce numerele reale sunt infinite și continue, numerele în virgulă mobilă sunt finite și discrete. Astfel, eroarea de reprezentare, care duce la eroarea de rotunjire, apare în numerele în virgulă mobilă.
Notarea sistemului virgulă mobilă Un sistem virgulă mobilă este caracterizat prin întregi: : baza de numerație; : precizia (numărul de zecimale); : intervalul exponenților, unde este marginea inferioară, iar cea superioară.
Orice este de forma:
unde este un întreg astfel încât pentru , iar este un întreg astfel încât .
Sistemul virgulă mobilă normalizat Un sistem de numere în virgulă mobilă este normalizat dacă prima cifră (cea mai semnificativă) este întotdeauna diferită de zero, cu excepția cazului în care numărul este zero. Deoarece mantisa este , într-un sistem normalizat mantisa unui număr diferit de zero satisface Astfel, forma normalizată IEEE a unui număr în virgulă mobilă diferit de zero este unde În binar, prima cifră este întotdeauna care dacă nu este scrisă se numește bit implicit. Acest lucru oferă un plus de precizie, astfel încât eroarea de rotunjire cauzată de eroarea de reprezentare este redusă.
Deoarece sistemul de numere în virgulă mobilă este finit și discret, nu poate reprezenta toate numerele reale, ceea ce înseamnă că numerele reale infinite pot fi aproximate doar prin anumite numere finite prin reguli de rotunjire. Aproximarea în virgulă mobilă a unui număr real dat este notată
Numărul total de numere în virgulă mobilă normalizate este:
unde numără semnul, pozitiv sau negativ; numără alegerea primei cifre; numără cifrele semnificative rămase; numără alegerea exponenților; numără cazul în care numărul este .
Standardul IEEE Precizie Semn(biți) Exponent(biți) Mantisa(biți) Simplă 1 8 23 Dublă 1 11 52 În standardul IEEE baza este binară, adică și se utilizează normalizarea. Standardul IEEE stochează semnul, exponentul și mantisa în câmpuri separate ale unui cuvânt în virgulă mobilă, fiecare având un număr fix de biți. Cele două niveluri de precizie cele mai frecvent utilizate pentru numerele în virgulă mobilă sunt precizia simplă și precizia dublă.
Epsilonul mașinii Epsilonul mașinii poate fi folosit pentru a măsura nivelul erorii de rotunjire în sistemul virgulă mobilă. Iată două definiții diferite. Epsilonul mașinii, notat este valoarea absolută a erorii de aproximare maximă posibilă la reprezentarea unui număr real diferit de zero într-un sistem în virgulă mobilă.
Epsilonul mașinii, este cea mai mică valoare estfel încât Adică: oricând
Aproximarea conform diferitelor metode de rotunjire x Trunchiere Eroare latrunchiere Rotunjirela apropiat Eroare larotunjire1,649 1,6 0,049 1,6 0,0491,650 1,6 0,050 1,6 0,0501,651 1,6 0,051 1,7 −0,049 1,699 1,6 0,099 1,7 −0,0011,749 1,7 0,049 1,7 0,0491,750 1,7 0,050 1,8 −0,050
Există două metode obișnuite de aproximare: trunchierea și rotunjirea la valoarea cea mai apropiată. Standardul IEEE folosește rotunjirea la valoarea cea mai apropiată. Trunchierea: Reprezentarea în baza a lui este trunchiată după a -a cifră. Această regulă de rotunjire deplasează întotdeauna rezultatul spre zero. Rotunjirea la valoarea cea mai apropiată: este luat la cel mai apropiat număr în virgulă mobilă de La exact jumătate se utilizează numărul în virgulă mobilă a cărui ultimă cifră este pară. În standardul IEEE, unde baza este , înseamnă că atunci când partea omisă este exact jumătate, numărul este rotunjit astfel încât ultima cifră să fie 0. Această regulă de rotunjire este ceva mai precisă, dar mai costisitoare din punct de vedere computațional. Rotunjirea astfel încât ultima cifră stocată să fie uniformă atunci când partea omisă este exact jumătate asigură faptul că aceasta nu este rotunjită sistematic în sus sau în jos. Acest lucru are scopul de a încerca să se evite posibilitatea unei devieri lente nedorite în calculele lungi, datorată unei rotunjiri de un singur tip. Exemplul din tabelul alăturat ilustrează nivelul erorii de rotunjire conform celor două metode. În general rotunjirea produce erori mai mici.
Calcularea erorii de rotunjire în standardul IEEE Exemplul următor este cu rotunjire la valoarea cea mai apropiată și în dublă precizie IEEE.
Numărul zecimal este:
Deoarece al 53-lea bit din dreapta virgulei binare este 1 și este urmat de alți biți diferiți de zero, regula rotunjirii la valoarea cea mai apropiată necesită rotunjirea în sus, adică adăugarea a 1 bit la al 52-lea bit. Astfel, reprezentarea normalizată în virgulă mobilă în standardul IEEE a lui 9.4 este:
Acum se poate calcula eroarea de rotunjire la reprezentarea lui prin Această reprezentare este obținută prin eliminarea cozii infinite
din dreapta: în pasul de rotunjire.
Atunci
Deci, eroarea de rotunjire este:
Măsurarea erorii de rotunjire folosind epsilonul mașinii Epsilonul mașinii poate fi utilizat pentru a măsura nivelul erorii de rotunjire atunci când se utilizează cele două reguli de rotunjire de mai sus (este utilizată prima definiție a epsilonului mașinii): Trunchiere: Rotunjire la valoarea cea mai apropiată: Deci pentru a avea aceeași precizie, în cazul trunchierii este necesar un bit în plus față de cazul rotunjirii.
Eroarea de rotunjire din cauza aritmeticii în virgulă mobilă Chiar dacă unele numere pot fi reprezentate exact prin numere în virgulă mobilă, efectuarea calculelor în aritmetica în virgulă mobilă poate duce la erori de rotunjire în rezultatul final.
Adunare Adunarea automată constă în alinierea virgulelor zecimale ale celor două numere care urmează să fie adunate, adunarea numerelor și apoi stocarea din nou a rezultatului ca număr în virgulă mobilă. Adunarea în sine se poate face cu o precizie mai mare, dar rezultatul trebuie rotunjit înapoi la precizia specificată, ceea ce poate duce la erori de rotunjire.
De exemplu, adunarea lui cu în dublă precizie IEEE se face după cum urmează:
Rezultatul este stocat ca deoarece în standardul IEEE se utilizează rotunjirea la valoarea cea mai apropiată. Prin urmare, este egal cu în dublă precizie IEEE, iar eroarea de rotunjire este .
Acest exemplu arată că se poate introduce o eroare de rotunjire la adunarea unui număr mare și a unuia mic. Deplasarea virgulelor zecimale din mantise pentru a face ca exponenții să se potrivească duce la pierderea unora dintre cifrele mai puțin semnificative. Pierderea preciziei poate fi descrisă ca absorbție.
De reținut că adunarea a două numere cu virgulă mobilă poate produce o eroare de rotunjire atunci când suma lor este cu un ordin de mărime mai mare decât cea a celui mai mare dintre două.
De exemplu, fie un sistem de numere în virgulă mobilă normalizat cu baza și precizie Atunci De observat că dar Există o eroare de rotunjire de
Acest tip de eroare poate apărea alături de o eroare de absorbție într-o singură operație.
Înmulțire În general, produsul a două mantise de cifre conține până la cifre, deci rezultatul s-ar putea să nu se încadreze în mantisă. Astfel, rezultatul va conține o eroare de rotunjire.
De exemplu, fie un sistem de numere în virgulă mobilă normalizat cu baza și precizie Atunci și De observat că dar deoarece el are mai mult de cifre semnificative. Eroarea de rotunjire va fi
Împărțire În general, câtul unor mantise de cifre poate conține mai mult de cifre. Prin urmare, rezultatul va avea o eroare de rotunjire.
De exemplu, fie sistemul de numere în virgulă mobilă de mai sus.</math> Atunci dar Astfel, coada este tăiată.
Scădere Absorbția apare și la scădere.
De exemplu, scăzând din în sistemul de numere în dublă precizie IEEE:
Rezultatul este stocat ca deoarece în standardul IEEE se folosește rotunjirea la valoarea cea mai apropiată. Ca urmare, este reținut ca iar eroarea de rotunjire este
Scăderea a două numere aproape egale produce anularea prin scădere. Când dispar prin scadere cifrele din față, rezultatul poate fi prea mic pentru a fi reprezentat exact și va fi reprezentat doar ca .
De exemplu, fie și se folosește a doua definiție a epsilonului mașinii. Care este soluția pentru ? Se știe că și sunt aproape egale, iar Totuși, în sistemul de numere în virgulă mobilă Deși este suficient de mare pentru a fi reprezentat, ambele influențe ale lui au fost eliminate prin rotunjire înainte de scădere, rezultatul fiind
Chiar și cu un ceva mai mare, de obicei rezultatul este încă semnificativ nesigur. Nu există prea multă încredere în acuratețea valorii, deoarece cea mai mare incertitudine în orice număr cu virgulă mobilă o reprezintă cifrele din extrema dreaptă.
De exemplu, Acest rezultat de este clar reprezentabil, dar nu prea există încredere în precizia sa.
Acumularea erorilor de rotunjire