Il est de notoriété publique qu'il faut être prudent lorsqu'on compare des valeurs à virgule flottante. En général, au lieu d'utiliser ==
nous utilisons des tests d'égalité basés sur epsilon ou ULP.
Cependant, je me demande s'il existe des cas où l'on utilise ==
est parfaitement bien ?
Regardez ce simple extrait, quels sont les cas où le succès est garanti ?
void fn(float a, float b) {
float l1 = a/b;
float l2 = a/b;
if (l1==l1) { } // case a)
if (l1==l2) { } // case b)
if (l1==a/b) { } // case c)
if (l1==5.0f/3.0f) { } // case d)
}
int main() {
fn(5.0f, 3.0f);
}
Note : J'ai vérifié este y este mais ils ne couvrent pas (tous) mes cas.
Note2 : Il semble que je doive ajouter quelques informations supplémentaires, afin que les réponses puissent être utiles en pratique : J'aimerais savoir :
- ce que dit la norme C++
- ce qui se passe, si une implémentation C++ suit IEEE-754
C'est la seule déclaration pertinente que j'ai trouvée dans la projet de norme actuel :
La représentation de la valeur des types à virgule flottante est définie par l'implémentation. [Note : Ce document n'impose aucune exigence sur la précision des opérations à virgule flottante ; voir également [support.limits]. - note de fin ]
Donc, cela signifie-t-il que même le "cas a)" est défini par l'implémentation ? Je veux dire, l1==l1
est définitivement une opération à virgule flottante. Donc, si une implémentation est "imprécise", alors pourrait-elle l1==l1
être faux ?
Je pense que cette question n'est pas un doublon du La virgule flottante == est-elle toujours acceptable ? . Cette question n'aborde aucun des cas que je pose. Même sujet, question différente. J'aimerais avoir des réponses spécifiques aux cas a)-d), pour lesquels je ne trouve pas de réponses dans la question dupliquée.