Oppure

Loading
28/06/13 20:10
Afa
#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?
aaa
28/06/13 20:52
Poggi Marco
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:
...
if (fabs(a-0.1)<0.000001) 
...
aaa
29/06/13 8:10
Afa
Capito, ma che valore viene assegnato ad a quando assegno a=0.1 (vorrei un esempio per capire completamente)
aaa
29/06/13 11:59
Poggi Marco
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.:
...
    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... ";
    ...
aaa
29/06/13 13:52
Afa
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)
aaa
29/06/13 17:26
Poggi Marco
Esatto! Avendo una precisione di 6 cifre, calcola una tolleranza di un milionesimo dal valore di controllo.
aaa
29/06/13 19:04
pierotofy
Senza prendere un valore arbitrario (ad esempio 0.000002), puoi sempre usare FLT_EPSILON.

gnu.org/software/libc/manual/html_node/…
Il mio blog: piero.dev
30/06/13 10:57
Afa
Postato originariamente da Poggi Marco:

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

Grazie mille^^

Postato originariamente da pierotofy:

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

gnu.org/software/libc/manual/html_node/…

Intendi in questo modo?
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 30/06/13 10:57
aaa