Предполагая, что IEEE-754 с плавающей точкой:
a >= b
всегда эквивалентно b <= a
. * a >= b
эквивалентно !(a < b)
, если только одинили оба из a
или b
являются NaN. a == b
всегда эквивалентно b == a
. * a == b
эквивалентно !(a != b)
, если только один илиa
или b
- это NaN.
В более общем смысле: трихотомия не выполняется для чисел с плавающей запятой.Вместо этого, связанное свойство имеет место [IEEE-754 (1985) §5.7]:
Возможны четыре взаимоисключающих отношения: меньше, равно, больше, и неупорядочено.Последний случай возникает, когда хотя бы один операнд является NaN.Каждый NaN должен сравнивать неупорядоченное со всем, в том числе и с самим собой.
Обратите внимание, что на самом деле это не «аномалия», а следствие расширения арифметики до степени, которая пытаетсяподдерживать согласованность с реальной арифметикой, когда это возможно.
[*] true в абстрактной арифметике IEEE-754.При реальном использовании некоторые компиляторы могут приводить к нарушению этого в редких случаях в результате выполнения вычислений с повышенной точностью (MSVC, я смотрю на вас).Теперь, когда большинство вычислений с плавающей запятой в архитектуре Intel выполняется на SSE вместо x87, это не представляет особой проблемы (и это всегда было ошибкой с точки зрения IEEE-754, во всяком случае).