Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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>​
  • appunti3s/errori_di_conversione.txt
  • Last modified: 2018/04/25 07:55
  • (external edit)