En C ++, est-ce exactement l’un de garanti pour être vrai sur les flottants?

En C ++, ai-je la garantie que, pour un nombre float a donné float a et float b , un seul et unique de a < b , a == b et a > b est vrai?

Si cela diffère entre les compilateurs et les plates-formes, je m’intéresse à Visual C ++ sur x86.

Non.

Il suffit que a ou b soit NaN pour que chacun des a < b , a == b et a > b soit faux.

Si à la fois a et b sont non-NaN, alors exactement 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, que vous pouvez distinguer en inspectant leurs représentations; elles sont toutes différentes les unes des autres car 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 même std::isnan() est souvent implémenté de cette façon, mais certains programmeurs qui devront lire votre code peut être confondu par celui-ci).

Et puis, si a et b sont le résultat de calculs antérieurs, il y a le problème de la précision excessive. Voir cet article pour une discussion en C. Le standard C99 a résolu le problème en rendant des règles explicites pour lesquelles une précision excessive pouvait et ne pouvait pas se produire, mais en héritant plus ou moins de ces règles en se référant au standard C pour FLT_EVAL_METHOD dans cfloat pratique, les compilateurs C prennent les règles plus au sérieux que les compilateurs C ++. Par exemple, GCC implémente les règles pour C lors de la compilation avec -std=c99 , et dans ce contexte, vous pouvez compter sur la propriété à conserver, mais GCC n'implémente pas ces règles lorsqu'il est utilisé comme compilateur C ++.