Afa (Normal User)
Rookie
Messaggi: 29
Iscritto: 17/06/2013
|
Codice sorgente - presumibilmente C/C++ |
#include<iostream.h>
void main(){
float a=0.1;
if(a == 0.1){
cout << "Ok" << endl;
}
return;
}
|
non riesco assolutamente a capire perchè questo codice non funziona, c'è qualche regola che mi sfugge?
|
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Ciao!
I tipi numerici a virgola mobile, hanno sempre un' approssimazione quando al loro interno viene memorizzata una cifra. Di conseguenza, non è sempre riconosciuta l' uguaglianza stretta (==). In questi casi, controlla che la differenza tra due valori sia inferiore ad un certo valore.
Esempio:
Codice sorgente - presumibilmente C/C++ |
...
if (fabs(a-0.1)<0.000001)
...
|
|
|
Afa (Normal User)
Rookie
Messaggi: 29
Iscritto: 17/06/2013
|
Capito, ma che valore viene assegnato ad a quando assegno a=0.1 (vorrei un esempio per capire completamente)
|
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Tieni presente che un float occupa 4 byte, quindi ha una precisione di 6 / 7 cifre.
Per capire questo comportamento, esegui dei programmi di prova.
Es.:
Codice sorgente - presumibilmente C/C++ |
...
float a=0.1f, b=0.5;
cout << "0.1-a " << 0.1-a << endl; // 0.1 viene considerato come double
cout << "0.5-a " << 0.5-b << endl; // 0.5 equivale a 2^-1; la differenza sarà nulla
cout << "0.1f-a " << 0.1f-a << endl; // 0.1 è dichiarato come float.
cout << "\nFine... ";
...
|
|
|
Afa (Normal User)
Rookie
Messaggi: 29
Iscritto: 17/06/2013
|
Ok e se volessi farlo anche per 0.2, 0.3, 0.5 ecc sarebbe
if (fabs(a-0.2)<0.000002)
if (fabs(a-0.3)<0.000003)
if (fabs(a-0.5)<0.000005)
|
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Esatto! Avendo una precisione di 6 cifre, calcola una tolleranza di un milionesimo dal valore di controllo.
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
|
|
Afa (Normal User)
Rookie
Messaggi: 29
Iscritto: 17/06/2013
|
Postato originariamente da Poggi Marco:
Esatto! Avendo una precisione di 6 cifre, calcola una tolleranza di un milionesimo dal valore di controllo. |
Grazie mille^^
Intendi in questo modo?
Codice sorgente - presumibilmente C/C++ |
if (fabs(a-0.2)<FLT_EPSILON)
if (fabs(a-0.3)<FLT_EPSILON)
if (fabs(a-0.5)<FLT_EPSILON)
|
o devo usarla dove?
non ho ben capito dal link allegato Ultima modifica effettuata da Afa il 30/06/2013 alle 12:57 |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Postato originariamente da Afa:
Intendi in questo modo?
Codice sorgente - presumibilmente C/C++ |
if (fabs(a-0.2)<FLT_EPSILON)
if (fabs(a-0.3)<FLT_EPSILON)
if (fabs(a-0.5)<FLT_EPSILON)
|
|
Si.
|
|