Per i numeri interi (positivi o negativi) la conversione tra sistema base 10 e base 2 del computer è sempre esatta e priva di errori.
Dal punto di vista matematico invece possono accadere dei problemi con i numeri decimali (con virgola). vedi en.wikipedia.org
I numeri decimali vengono memorizzati in due valori, mantissa ed esponente: MANTISSA * BASEESPONENTE
Anche le calcolatrici usano questa notazione esponenziale: 1 * 10-37 o anche 1E-37
In tutti i casi appena descritti, poiché il computer ha un numero di cifre limitato, commetterà sicuramente un errore nel calcolo…
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
// 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; }