28.01.2015 Views

Tutorial Python - Starship

Tutorial Python - Starship

Tutorial Python - Starship

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!