В C++ точно ли один из <, == и> должен быть истинным на float?

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

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

1 ответ

Решение

Нет.

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

Если оба a а также b не-NaN, то точно один из a < b, a == b или же a > b должно быть правдой.

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

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

Другие вопросы по тегам