с плавающей точкой — в C ++ это точно один из & lt ;, == и & gt; гарантированно будет правдой на поплавках?

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

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

47

Решение

Нет.

Этого достаточно для любого 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 ++.

76

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]