Ответ 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 не применяет эти правила при использовании в качестве компилятора С++.