对于IEEE 754 NaN值返回false的所有比较的理由是什么?
为什么对NaN值的比较与所有其他值的行为不同?也就是说,与操作符=、<=、>=、<、>的所有比较,其中一个或两个值为NaN返回false,这与所有其他值的行为相反。
我想这在某种程度上简化了数值计算,但我找不到明确说明的原因,甚至在关于IEEE 754现状的讲义其中详细讨论了其他设计决策。
这种不正常的行为在进行简单的数据处理时会造成麻烦。例如,当对记录列表进行排序时,w.r.t。在一个C程序中的一些实值字段,我需要编写额外的代码来处理作为最大元素的NaN,否则排序算法可能会变得混乱。
编辑:到目前为止,所有的答案都认为比较NAN是毫无意义的。
我同意,但这并不意味着正确的答案是错误的,而是一个非布尔值(NAB),幸运的是它并不存在。
因此,在我看来,为比较返回真假的选择是任意的,对于一般的数据处理来说,如果它遵循通常的定律(自反性=,<,=,>的三分法),那么它将是有利的,以免依赖这些定律的数据结构变得混乱。
所以我要求的是打破这些规律的一些具体好处,而不仅仅是哲学推理。
编辑2:我想我现在明白了为什么要使NaN最大化是个坏主意,它会把上限的计算搞砸。
NaN!=NaN可能是避免在循环中检测收敛的理想方法,例如
while (x != oldX) {
oldX = x;
x = better_approximation(x);
}
但是,最好是将绝对差与小限度进行比较。因此,IMHO,这是一个相对薄弱的理由,打破自反性在NaN。