I математика, x <= y
эквивалентна !(x > y)
. Это справедливо для арифметики с плавающей запятой, в большинстве случаев, но не всегда. Если x
или y
- NaN, x <= y
не эквивалентно !(x > y)
, так как сравнение a NaN
ко всему всегда возвращает false
. Но все же, x <= y <=> !(x > y)
истинно больше всего времени.
Теперь предположим, что я пишу класс, содержащий значения с плавающей запятой, и я хочу определить операторы сравнения для этого класса. Предположим, что я пишу высокоточное число с плавающей запятой, которое использует одно или несколько значений double
для хранения высокоточного числа. Математически определение x < y
для этого класса уже определяет все остальные операторы (если я согласен с обычной семантикой операторов сравнения). Но NaN
нарушить эту математическую тонкость. Поэтому, может быть, мне приходится писать многие из этих операторов отдельно, просто чтобы учесть NaNs. Но есть ли лучший способ? Мой вопрос: как я могу избежать дублирования кода как можно больше и по-прежнему уважать поведение NaN
?
Связано: http://www.boost.org/doc/libs/1_59_0/libs/utility/operators.htm. Как оптимизация/операторы разрешают эту проблему?
Примечание. Я отметил этот вопрос c++
, потому что это то, что я понимаю. Пожалуйста, напишите примеры на этом языке.