为了账号安全,请及时绑定邮箱和手机立即绑定

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

对于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。
查看完整描述

4 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

NaN可以被认为是一个未定义的状态/数字。类似于0/0是未定义或sqrt(-3)的概念(在实数系统中,浮点存在)。

NaN用作这种未定义状态的占位符。从数学上讲,未定义不等于未定义。您也不能说一个未定义的值大于或小于另一个未定义的值。因此,所有比较都返回false。

在比较sqrt(-3)和sqrt(-2)的情况下,这种行为也是有利的。它们都会返回NaN,但是即使它们返回相同的值,它们也不是等价的。因此,在处理NaN时,平等总是返回FALSE是理想的行为。


查看完整回答
反对 回复 2019-06-03
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

再加上另一个类比。如果我递给你两个盒子,告诉你两个盒子都没有苹果,你会告诉我盒子里装的东西是一样的吗?

NaN不包含关于什么是什么,只是它不是什么的信息。因此,这些要素绝对不能说是平等的。


查看完整回答
反对 回复 2019-06-03
  • 4 回答
  • 0 关注
  • 743 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信