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