Bonjour,

Je me pose quelques questions sur les calculs et comparaisons de flottants et sur l'emploi de la macro :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
#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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
#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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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