Bonjour,
Je me pose quelques questions sur les calculs et comparaisons de flottants et sur l'emploi de la macro :
#define FLOAT_EQ(_x, _y, _epsi) ((((_y) - (_epsi)) < (_x)) && ((_x) < ((_y) + (_epsi))))
avec _epsi généralement égal à à FLT_EPSILON qui est défini dans float.h :
#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
Or, d'après moi, des que x devient un peu grand, le flottant x-FLT_EPSILON (resp x+FLT_EPSILON) est égal à x. Dans le code suivant, a==x
1 2 3
|
float x = 3;
float a = x - FLT_EPSILON; |
pourtant, quand on compare directement x - FLT_EPSILON et x, il sont bien differents :
1 2
|
bool eq1 = x - FLT_EPSILON < x; |
et FLOAT_EQ(x, 3, FLT_EPSILON) vaut bien true.
J'ai ma petite idée sur la raison mais j'aimerais en être sûr.
Le c++ prévoit-il que tous les calculs et comparaisons de flottans (float, double,...) soient réalisés sur des réels (10 bytes) ou bien est-ce dû à l'implémentation de mon compilo(VC8)?
Et vous, comment testez vous l'égalité entre deux flottants?
Merci pour vos réponses
Partager