Bonjour,
Je me pose quelques questions sur les calculs et comparaisons de flottants et sur l'emploi de la macro :
avec _epsi généralement égal à à FLT_EPSILON qui est défini dans float.h :Code:#define FLOAT_EQ(_x, _y, _epsi) ((((_y) - (_epsi)) < (_x)) && ((_x) < ((_y) + (_epsi))))
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==xCode:#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
pourtant, quand on compare directement x - FLT_EPSILON et x, il sont bien differents :Code:
1
2
3 float x = 3; float a = x - FLT_EPSILON;
et FLOAT_EQ(x, 3, FLT_EPSILON) vaut bien true.Code:
1
2 bool eq1 = x - FLT_EPSILON < x;
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