User Tools

Site Tools


appunti3s:errori_di_conversione

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 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

  • 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)base 10 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…

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
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;
}
appunti3s/errori_di_conversione.txt · Last modified: 2020/06/08 22:19 by 127.0.0.1