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.
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++.