Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Aritmetica binară în virgulă flotantă are multe surprize de acest gen. Problema cu "0.1" este explicată în secţiunea<br />
următoare, "Erori de reprezentare". Vezi : The Perils of Floating Point privind tratarea completă a altor surprize<br />
de acest gen.<br />
Cum s-ar spune la sfârşit: "nu este uşor de răspuns". Totuşi nu disperaţi din cauza virgulei flotante! Erorile<br />
operaţiilor de flotantă din <strong>Python</strong> sunt moştenite de la virgula flotantă a hardware-ului şi la majoritatea maşinilor<br />
sunt de un ordin mai mic de 1/2**53 pe operaţie. Acestea sunt mai mult decât acceptabile pentru cele mai multe<br />
aplicaţii, dar trebuie să reţineţi că nu sunt datorate aritmeticii zecimale şi că la fiecare operaţie învirgulă flotantă<br />
apare o eroare de rotunjire.<br />
Până la apariţia unor cazuri patologice, pentru cele mai multe situaţii de utilizare a aritmeticii învirgulă flotantă<br />
se obţin rezultatele aşteptate, dacă pur şi simplu se rotunjeşte rezultatul final afişat la numărul de zecimale dorit.<br />
Uzual funcţia str() este suficientă, iar pentru un control mai riguros a se vedea discuţia despre operatorul de<br />
format % : formatele %g, %f şi %e sunt moduri flexibile şi uşoare pentru afişarea rezultatelor.<br />
B.1 Erori de reprezentare<br />
Secţiunea explică îndetaliu exemplul "0.1" şi arată cum se poate face o analiză exactă a cazurilor. În principal se<br />
urmăreşte familiarizarea cu reprezentarea binară în virgulă floantă.<br />
Eroarea de reprezentare se referă la faptul că fracţiile zecimale nu se pot reprezenta exact ca fracţii binare (în<br />
baza 2). Acesta este motivul major pentru care <strong>Python</strong> (sau Perl, C, C++,Java, Fortran, şi multe altele) nu afişează<br />
valoarea exactă a numărului zecimal pe care-l aşteptaţi :<br />
>>> 0.1<br />
0.10000000000000001<br />
Ce este asta 1/10 nu este reprezentat exact ca o fracţie binară. Cele mai multe maşini utilizează astăzi (noiembrie<br />
2000) aritmetica de virgulă flotantă IEEE-754 şi cele mai multe platforme mapează flotantele <strong>Python</strong> în"dublă<br />
precizie" IEEE-754. Dublele 754 au 53 biţi de precizie. Aşa că la intrarea în calculator se chinuie să convertească<br />
0.1 încea mai apropiată fracţie posibilă de forma J/2**N, unde J este un întreg de exact 53 de biţi. Se rescrie<br />
1 / 10 ~= J / (2**N)<br />
ca<br />
J ~= 2**N / 10<br />
şi reapelând J are exact 53 de biţi (este >= 2**52 dar < 2**53), şi cea mai bună valoare pentru N este 56:<br />
>>> 2L**52<br />
4503599627370496L<br />
>>> 2L**53<br />
9007199254740992L<br />
>>> 2L**56/10<br />
7205759403792793L<br />
Asta este, 56 este singura valoare pentru N care lasă J cu exact 53 de biţi. Atunci cea mai bună valoare posibilă<br />
pentru J este câtul rotunjit:<br />
B.1. Erori de reprezentare 91