web-dev-qa-db-fra.com

En C ++, est-ce exactement l'un des <, == et> garantis pour être vrai sur les flottants?

En C++, ai-je la garantie que, pour tout float a et float b, un et un seul des a < b, a == b et a > b est vrai?

Si cela diffère entre les compilateurs et les plates-formes, je suis intéressé par Visual C++ sur x86.

47
MacMillan

Non.

Il suffit que a ou b soit NaN pour chacun de a < b, a == b Et a > b Pour être faux.

Si a et b ne sont pas NaN, alors l'un des a < b, a == b Ou a > b Doit être vrai.

En complément, cette réponse vous indique comment obtenir une valeur NaN en C++ (il existe plusieurs valeurs NaN, qui peuvent être distingués en inspectant leurs représentations; elles sont toutes différentes les unes des autres parce que NaN n'est jamais égal à rien,) et comment vous pouvez tester si une valeur est un NaN (un test idiomatique pour voir si une variable x est un NaN est x != x, et en effet std::isnan() est souvent implémenté de cette façon, mais certains programmeurs qui devront lire votre code peuvent en être déroutés).

Et puis, si a et b sont les résultats de calculs précédents, il y a le problème de la précision excessive. Voir ceci article pour une discussion en C. La norme C99 a résolu le problème en rendant explicites les règles pour les cas où une précision excessive pouvait et ne pouvait pas se produire, mais malgré C++ héritant plus ou moins de ces règles en se reportant au C standard pour la définition de FLT_EVAL_METHOD dans cfloat, dans la pratique les compilateurs C prennent les règles plus au sérieux que les compilateurs C++. Par exemple, GCC implémente les règles de C lors de la compilation avec -std=c99, Et dans ce contexte, vous pouvez compter sur la propriété à conserver, mais à ce jour, GCC n'implémente pas ces règles lorsqu'il est utilisé comme compilateur C++.

76
Pascal Cuoq