Подтвердить что ты не робот

В С++, точно один из <, == и> гарантированно верен в поплавках?

В С++ у меня есть гарантия, что для любых заданных float a и float b истинно только один из a < b, a == b и a > b?

Если это отличается между компиляторами и платформами, меня интересует Visual С++ на x86.

4b9b3361

Ответ 1

Нет.

Достаточно для a или b для NaN для каждого из a < b, a == b и a > b для false.

Если оба a и b не являются NaN, тогда должно быть истинно только одно из a < b, a == b или a > b.

В дополнении, этот ответ сообщает вам, как вы можете получить значение a NaN в С++ (имеется несколько значений NaN, которые могут быть отличающиеся проверкой их представлений, все они отличаются друг от друга, потому что NaN никогда не равен чему-либо), и как вы можете проверить, является ли значение NaN (идиоматический тест, чтобы увидеть, является ли переменная x NaN x != x, и действительно std::isnan() часто реализуется таким образом, но некоторые программисты, которым придется читать ваш код, могут быть смущены им).

И тогда, если a и b являются результатами предыдущих вычислений, возникает проблема избыточной точности. См. Эту статью статью для обсуждения в C. Стандарт C99 решил проблему, сделав правила явными, где избыточная точность могла и не могла произойти, но несмотря на то, что С++ более или менее наследует эти правила, отложив до стандарта C для определения FLT_EVAL_METHOD в cfloat, на практике компиляторы C принимают правила более серьезно, чем компиляторы С++. Например, GCC реализует правила для C при компиляции с помощью -std=c99, и в этом контексте вы можете полагаться на свойство для хранения, но на момент написания этой статьи GCC не применяет эти правила при использовании в качестве компилятора С++.