猿问

对于IEEE 754 NaN值返回false的所有比较的理由是什么?

对于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。


慕田峪9158850
浏览 744回答 4
4回答

慕的地10843

NaN可以被认为是一个未定义的状态/数字。类似于0/0是未定义或sqrt(-3)的概念(在实数系统中,浮点存在)。NaN用作这种未定义状态的占位符。从数学上讲,未定义不等于未定义。您也不能说一个未定义的值大于或小于另一个未定义的值。因此,所有比较都返回false。在比较sqrt(-3)和sqrt(-2)的情况下,这种行为也是有利的。它们都会返回NaN,但是即使它们返回相同的值,它们也不是等价的。因此,在处理NaN时,平等总是返回FALSE是理想的行为。

哆啦的时光机

再加上另一个类比。如果我递给你两个盒子,告诉你两个盒子都没有苹果,你会告诉我盒子里装的东西是一样的吗?NaN不包含关于什么是什么,只是它不是什么的信息。因此,这些要素绝对不能说是平等的。
随时随地看视频慕课网APP
我要回答