BenGourion73
Messages postés9Date d'inscriptionmardi 19 décembre 2000StatutMembreDernière intervention 2 mars 2009
-
1 sept. 2008 à 09:46
Stanel
Messages postés6Date d'inscriptionvendredi 18 mai 2007StatutMembreDernière intervention16 décembre 2008
-
5 sept. 2008 à 15:42
Bonjour,
Ma question est très simple. je souhaite gérer des nombres entiers mais avec le type double. Le hic, c'est que C++ a une facheuse tendance à parfois transformer 14.0 en 13.9999999999999. Or typiquement, cela compromet un test d'égalité avec un long même si celui-ci est casté en double... Ma solution actuel est de fixer un static const ECARTLNG qui vaut 1.10-16
et quand je teste un double à l'égalité avec long casté en double, je teste l'écart.
En code, ça donne ça :
double Toto = 13.9999999999999999 /// Au départ, Toto a été initialisé à 14.0 mais à un moment donné 14.0 est
/// devenu 13.9999999999999999
long Bob = 14;
if (Toto = = (double)Bob) /// la clairement, ça va donner false alors que je souhaite true !
return true;
else
return false
//// Ma solution
const static double ECARTLNG 1e-16
if (Toto-(double)Bob > ECARTLNG)
return false;
else
return true;
là a priori, le test d'égalité va fonctionner mais n'y a t'il pas moyen de faire autrement ?
Série d'instructions sur Toto
A voir également:
Cast de double en long et vice-versa : question pas si triviale
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 1 sept. 2008 à 11:55
Hello,
Il n'est pas conseillé de faire des tests d'égalité sur les flottants, justement à cause des arrondis dues à la précision machine.
Généralement, on teste si la différence entre les 2 valeurs est inférieures (en valeur absolue) à un certain epsilon:
if (fabs(x2 - x1)<epsilon)
// on peut dire que les 2 valeurs sont égales
else
// on peut dire que les 2 valeurs sont différentes
Donc ta solution est tout à fait valable.
@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...