Почему сравнение значений NaN ведет себя по-другому от всех других значений? То есть все сравнения с операторами ==, < =, > =, <, > где одно или оба значения являются NaN, возвращает false, что противоречит поведению всех других значений.
Я полагаю, это каким-то образом упрощает численные вычисления, но я не смог найти явно сформулированную причину, даже в лекциях о статусе IEEE 754 Кахан, который подробно обсуждает другие проектные решения.
Это отклоняющееся поведение вызывает проблемы при простой обработке данных. Например, при сортировке списка записей w.r.t. какое-то вещественное поле в программе C Мне нужно написать дополнительный код для обработки NaN в качестве максимального элемента, иначе алгоритм сортировки может запутаться.
Edit: Ответы до сих пор утверждают, что сравнивать NaNs бессмысленно.
Я согласен, но это не значит, что правильный ответ ложный, скорее это было бы не-булево (NaB), которого, к счастью, не существует.
Таким образом, выбор возврата true или false для сравнений на мой взгляд произволен, и для общей обработки данных было бы выгодно, если бы оно подчинялось обычным законам (рефлексивность ==, трихотомия <, ==, > ), чтобы структуры данных, которые полагаются на эти законы, запутались.
Поэтому я прошу о конкретном преимуществе нарушения этих законов, а не только философских рассуждений.
Изменить 2: Я думаю, теперь я понимаю, почему создание NaN maximal было бы плохой идеей, это испортило бы вычисление верхних пределов.
NaN!= NaN может быть желательным, чтобы избежать обнаружения сходимости в петле, такой как
while (x != oldX) {
oldX = x;
x = better_approximation(x);
}
которые, однако, лучше писать, сравнивая абсолютную разность с малым пределом. Поэтому ИМХО это относительно слабый аргумент для нарушения рефлексивности при NaN.