Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C++] Problema di precisione con double
Forum - C/C++ - [C++] Problema di precisione con double

Avatar
nabbopazzo (Normal User)
Rookie


Messaggi: 34
Iscritto: 19/01/2009

Segnala al moderatore
Postato alle 22:09
Lunedì, 11/04/2011
Salve a tutti!
Avrei una domanda da porre:
compilando e avviando questo codice in windows
Codice sorgente - presumibilmente C/C++

  1. a=-0.5;b=0.5;in=100;
  2.                double dx=(b-a)/in;
  3.                for(double i=0;i<100;i++){
  4.                stringstream temp;
  5.                temp.precision(std::numeric_limits<double>::digits10);
  6.                temp<<a+(dx*i);
  7.                cout<<temp.str()<<endl;
  8.                }


nell'output appare qualcosa di inaspettato: da -0.5 a -0.02 tutto ok, ma invece di -0.01 mi appare -0.00999999999999999 e invece di 0 appare 1.04083408558608e-17.
Perchè pur sottraendo sempre lo stesso numero e partendo da una costante arrivati a questi valori (solo +/- 0.01 e 0) avviene ciò?
Ho provato a cambiare ide e compilatore, provando sia dev c++ che netbeans con cygwin, ma non ho risolto nnt.
Qualcuno sa spiegarne il motivo o sa darmi una soluzione?
Vi ringrazio in anticipo

PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6108
Iscritto: 04/12/2003

Up
1
Down
V
Segnala al moderatore
Postato alle 22:18
Martedì, 12/04/2011
Certi numeri double non possono essere rappresentati perfettamente a causa della natura dei numeri binari. 0.1 e' un classico esempio.

Decimale=.1
Binario=.00011111111 ... infinito numero di 1.

Quando vuoi fare una comparazione (numero == 0?) che involve operazioni complesse che possono causare questi problemi di arrotondamento, o chiami round prima di fare la comparazione (round(numero, N) == 0) oppure setti un limite delta entro il quale limite di errore e' accettabile (0 - numero in range(0.00001, -0.00001)).

Lo so, pochi libri (ed insegnanti) lo accennano.

Ultima modifica effettuata da pierotofy il 12/04/2011 alle 22:22
Intanto ti ringrazio per il chiarimento (che fa sempre molto piacere) poi aggiungo che ho risolto proprio con l'arrotondamento a 14 cifre decimali. La perdita di un paio di cifre tutto sommato è accettabile, ma comunque è fastidioso non avere il risultato previsto. - nabbopazzo - 13/04/11 00:21


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Up
-1
Down
V
Segnala al moderatore
Postato alle 22:36
Lunedì, 11/04/2011
Ciao!

I numeri double sono a virgola mobile, quindi soggetti ad un errore di troncamento della parte meno significativa.

E se lo volessi evitare? Perchè 0.010000000000000 diventa 0.009999999999999? E perchè succede solo a questo numero? - nabbopazzo - 11/04/11 23:45


Nulla va più veloce della luce, quindi rilassati.
PM