Differences
This shows you the differences between two versions of the page.
— |
appunti3s:errori_di_conversione [2018/04/25 07:55] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Numeri interi ====== | ||
+ | Per i numeri interi (positivi o negativi) la conversione tra sistema base 10 e base 2 del computer è sempre esatta e priva di errori. | ||
+ | |||
+ | ====== Numeri con la virgola ====== | ||
+ | |||
+ | Dal punto di vista matematico invece possono accadere dei problemi con i numeri decimali (con virgola). | ||
+ | vedi [[http://en.wikipedia.org/wiki/Floating_point#Representable_numbers.2C_conversion_and_rounding|en.wikipedia.org]] | ||
+ | |||
+ | I numeri decimali vengono memorizzati in due valori, mantissa ed esponente: | ||
+ | MANTISSA * BASE<sup>ESPONENTE</sup> | ||
+ | |||
+ | Anche le calcolatrici usano questa notazione esponenziale: 1 * 10<sup>-37</sup> o anche 1E-37 | ||
+ | |||
+ | * La prima osservazione: è impossibile rappresentare al computer numeri Irrazionali o Razionali Periodici illimitati. | ||
+ | * Una seconda osservazione: alcuni numeri in base 10, anche con poche cifre decimali, potrebbero essere convertiti in numeri in base 2 con un numero illimitato di cifre dopo la virgola (e viceversa). Questo perché, in base 2, i numeri con la virgola sono limitati solo quando il denominatore è una potenza del 2. Esempio (0.1)<sub>base 10</sub> viene approssimato (usando 24 bit) con 0.10000000149011... In fondo a questa pagina si trova lo svolgimento della conversione e il codice di un programma. | ||
+ | |||
+ | In tutti i casi appena descritti, poiché il computer ha un numero di cifre limitato, commetterà sicuramente un errore nel calcolo... | ||
+ | |||
+ | <code> | ||
+ | Tabella tratta da http://en.wikipedia.org/wiki/Binary_numeral_system | ||
+ | Converting Result | ||
+ | 0.1 0. | ||
+ | 0.1 × 2 = 0.2 < 1 0.0 | ||
+ | 0.2 × 2 = 0.4 < 1 0.00 | ||
+ | 0.4 × 2 = 0.8 < 1 0.000 | ||
+ | 0.8 × 2 = 1.6 ≥ 1 0.0001 | ||
+ | 0.6 × 2 = 1.2 ≥ 1 0.00011 | ||
+ | 0.2 × 2 = 0.4 < 1 0.000110 | ||
+ | 0.4 × 2 = 0.8 < 1 0.0001100 | ||
+ | 0.8 × 2 = 1.6 ≥ 1 0.00011001 | ||
+ | 0.6 × 2 = 1.2 ≥ 1 0.000110011 | ||
+ | 0.2 × 2 = 0.4 < 1 0.0001100110 | ||
+ | </code> | ||
+ | |||
+ | <file cpp 10.cpp> | ||
+ | |||
+ | // questo programma è stato scritto da Fabio | ||
+ | // | ||
+ | // mostra che la differenza 1 - 1 non fa 0. | ||
+ | // perché il primo 1 è stato ottenuto moltiplicando 0.1*10 | ||
+ | // un'operazione che (in base 2) comporta degli errori di troncamento. | ||
+ | // Gli errori diventano visibili solo quando si elimina la parte intera del numero (1) | ||
+ | // Dando modo all'elaboratore di visualizzare solo la parte decimale in notazione esponenziale | ||
+ | // | ||
+ | // in un sistema a 32 bit, il risultato della differenza dovrebbe essere 1.49012e-08 | ||
+ | |||
+ | #include <iostream> | ||
+ | |||
+ | int main () | ||
+ | { | ||
+ | float differenza; | ||
+ | differenza = 0.1*10.0-1.0; | ||
+ | std::cout << differenza << "\n"; | ||
+ | return 0; | ||
+ | } | ||
+ | </file> |