Wednesday, December 02, 2020 05:56

Cuprins >> Introducere > Erorile de calcul ale valorilor reale

Erorile de calcul ale valorilor reale

În calculele cu tipuri de date reale în virgulă mobilă, este posibil să se observe un comportament ciudat, deoarece în timpul reprezentării unui număr real, de multe ori se întâmplă să se piardă precizie. Acest lucru se întâmplă din cauza incapacității unor numere reale de a fi reprezentate exact ca sumă a puterilor negative ale numărului 2. Exemple de numere care nu au o reprezentare corectă în tipurile de date float și double sunt de exemplu, 0.1, 1/3, 2/7 și altele. Iată un exemplu de cod C# care demonstrează erorile de calcul ale valorilor reale, cu numere în virgulă mobilă în:

Motivul pentru rezultatul neașteptat din primul exemplu este faptul că numărul 0,1 (adică 1/10) nu are nici o reprezentare corectă în formatul real, și se înregistrează valoarea aproximativă. Atunci când rezultatele sunt afișate în mod direct, ele arata corect, din cauza rotunjirii. Rotunjirea se face în timpul conversiei numărului într-un șir de caractere ce poate fi imprimat la consolă. La trecerea de la float la double, reprezentarea aproximativă a formatului numerelor este mai ușor de observat. Prin urmare, rotunjirea nu mai ascunde reprezentarea incorectă și putem observa erorile după a opta cifră.

În al doilea caz, numărul 1/3 nu are nici o reprezentare corectă și este rotunjit la un număr foarte aproape de 0.3333333. Valoarea acestui număr este în mod clar vizibilă atunci când este atribuită unei variabile de tip double, care păstrează mai multe cifre semnificative.

Ambele exemple arată că operațiile matematice implicând numere în virgulă mobilă pot produce greșeli, și, prin urmare, nu sunt adecvate pentru calcule financiare exacte. Din fericire, C# suportă aritmetica de precizie zecimală, când numere de genul 0.1 sunt prezentate în memorie fără rotunjire. Dar, ca și regulă generală, amintiți-vă că nu toate numerele reale au o reprezentare corectă în tipurile de date float și duble. De exemplu, numărul 0.1 este reprezintat rotunjit în tipul float, ca 0.099999994.

C# sprijină așa-numita artimetică zecimală în virgulă mobilă, când numerele sunt reprezentate mai degrabă prin sistemul numeric zecimal, decât cel binar. Astfel, tipul de aritmetică în virgulă mobilă zecimală nu-și pierde precizia atunci când stochează și procesează numere în virgulă mobilă, și nu veți întâmpina erorile de calcul ale valorilor reale.

Tipul de date pentru numere reale cu precizie zecimală în C# este tipul decimal, pe 128 de biți. Așa că, atunci când se întâmpină situații în care precizia numerelor reale este crucială, cum ar fi programele financiare, utilizați întotdeauna variabile de tip decimal.

Conceptele explicate în această lecție sunt prezentate și vizual, ca parte a următorului videoclip:

 

EXERCIȚII
1. Scrieți un program care compară corect două numere reale, cu o precizie de cel puțin 0.000001.

Soluție


Două variabile în virgulă mobilă sunt considerate egale dacă diferența dintre valorile lor este mai mică decât precizia prestabilită (ex 0,000001):

Comments

comments

Tags: , , , , ,

Leave a Reply



Do NOT follow this link or you will be banned from the site!