В C ++ у меня есть гарантия, что для любого данного float a
а также float b
один и только один из a < b
, a == b
а также a > b
правда?
Если это отличается между компиляторами и платформами, меня интересует Visual C ++ на x86.
Нет.
Этого достаточно для любого 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 ++.
Других решений пока нет …