Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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?

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
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. ...


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)

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
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.     ...


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)

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
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.

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
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 ...


Il mio blog: https://piero.dev
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
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
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.


Il mio blog: https://piero.dev
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo