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