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++ - Problema if
Forum - C/C++ - Problema if

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Afa (Normal User)
Rookie


Messaggi: 29
Iscritto: 17/06/2013

Segnala al moderatore
Postato alle 22:10
Venerdì, 28/06/2013
Codice sorgente - presumibilmente C/C++

  1. #include<iostream.h>
  2.  
  3. void main(){
  4.         float a=0.1;
  5.         if(a == 0.1){
  6.                 cout << "Ok" << endl;
  7.         }
  8.         return;
  9. }


non riesco assolutamente a capire perchè questo codice non funziona, c'è qualche regola che mi sfugge?


"Il programmatore e' qualcuno che corregge errori che non sai di avere in un modo che non puoi capire"
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 22:52
Venerdì, 28/06/2013
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++

  1. ...
  2. if (fabs(a-0.1)<0.000001)
  3. ...



Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
Afa (Normal User)
Rookie


Messaggi: 29
Iscritto: 17/06/2013

Segnala al moderatore
Postato alle 10:10
Sabato, 29/06/2013
Capito, ma che valore viene assegnato ad a quando assegno a=0.1 (vorrei un esempio per capire completamente)


"Il programmatore e' qualcuno che corregge errori che non sai di avere in un modo che non puoi capire"
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 13:59
Sabato, 29/06/2013
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++

  1. ...
  2.     float a=0.1f, b=0.5;
  3.     cout << "0.1-a  " << 0.1-a << endl; // 0.1 viene considerato come double
  4.     cout << "0.5-a  " << 0.5-b << endl; // 0.5 equivale a 2^-1; la differenza sarà nulla
  5.     cout << "0.1f-a " << 0.1f-a << endl; // 0.1 è dichiarato come float.
  6.     cout << "\nFine... ";
  7.     ...



Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
Afa (Normal User)
Rookie


Messaggi: 29
Iscritto: 17/06/2013

Segnala al moderatore
Postato alle 15:52
Sabato, 29/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)


"Il programmatore e' qualcuno che corregge errori che non sai di avere in un modo che non puoi capire"
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 19:26
Sabato, 29/06/2013
Esatto! Avendo una precisione di 6 cifre, calcola una tolleranza di un milionesimo dal valore di controllo.


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6110
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 21:04
Sabato, 29/06/2013
Senza prendere un valore arbitrario (ad esempio 0.000002), puoi sempre usare FLT_EPSILON.

http://www.gnu.org/software/libc/manual/html_node/Floating ...


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

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
Afa (Normal User)
Rookie


Messaggi: 29
Iscritto: 17/06/2013

Segnala al moderatore
Postato alle 12:57
Domenica, 30/06/2013
Testo quotato

Postato originariamente da Poggi Marco:

Esatto! Avendo una precisione di 6 cifre, calcola una tolleranza di un milionesimo dal valore di controllo.


Grazie mille^^

Testo quotato

Postato originariamente da pierotofy:

Senza prendere un valore arbitrario (ad esempio 0.000002), puoi sempre usare FLT_EPSILON.

http://www.gnu.org/software/libc/manual/html_node/Floating ...


Intendi in questo modo?
Codice sorgente - presumibilmente C/C++

  1. if (fabs(a-0.2)<FLT_EPSILON)
  2. if (fabs(a-0.3)<FLT_EPSILON)
  3. 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


"Il programmatore e' qualcuno che corregge errori che non sai di avere in un modo che non puoi capire"
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6110
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 18:39
Domenica, 30/06/2013
Testo quotato

Postato originariamente da Afa:
Intendi in questo modo?
Codice sorgente - presumibilmente C/C++

  1. if (fabs(a-0.2)<FLT_EPSILON)
  2. if (fabs(a-0.3)<FLT_EPSILON)
  3. if (fabs(a-0.5)<FLT_EPSILON)





Si.


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

Fai quello che ti piace, e fallo bene.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo