NaN!= NaN的直观原因是什么?

时间:2018-05-01 21:53:42

标签: floating-point

从我能够找到的,IEEE定义NaN在浮点数系统中不相等。我唯一一次将NaN与NaN进行比较是在比较数据帧条目,在这种情况下,NaN的这个属性实际上是一个很大的麻烦。

只是想知道为什么决定使NaN不等于自己,不像其他Null值。 (例如,在python中,像None一样。)

1 个答案:

答案 0 :(得分:3)

IEEE 754定义了一个浮点运算系统。它的相等运算符测试两个数字是否相等。 (这与测试两个对象是否相同不同。)NaN表示非数字的东西。两个NaN可以是相同的,但它们不能是相同的数字,因为它们不是数字。

这一点很重要的一个原因是NaN用于传达操作误入歧途的信息。例如,假设使用浮点运算计算了两个数字xy。然而,进一步假设由于舍入误差,在计算x时的某个时刻,理想情况下应该是小的正值的值是小的负值,然后取其平方根。结果是NaN。类似地,在计算y时,理想情况下小于1的值略大于取其反正弦时的值,结果又是NaN。

现在xy都是NaN。如果x == y返回true,则表示两个计算值相等。但实际上,我们不知道要计算的值是否相等。所以这不是我们想要的结果。

同样,如果我们在x < yx > y中的一个或两个是NaN时分配了xy的结果,那么浮点算法会得到错误的结果。如果一个操作数是NaN,那么我们想要的答案是“哪个订单是xy?”是“我们不知道。”所以x == y,{{1}当两个操作数都是NaN时,并且x < y都返回false,并且浮点算法的设计必须考虑到这一点。

创建NaN的一个原因是,当发生错误时,浮点操作不必停止。使用许多数字的非常长的浮点算法可以继续执行,然后程序可以检查最后的结果以查看是否有任何NaN。然后由程序来处理那些适合该特定程序的方法。 (一般来说,没有一个解决方案可以解决浮点算法中的问题。因此,IEEE 754旨在为实现提供一些灵活性。程序可以根据需要修复结果或转移其操作。)

提供IEEE-754操作的平台通常应该提供数值相等的比较(用于测试算术属性)以及排序顺序和标识的比较(用于将对象插入到排序列表或其他结构(如字典)中时)

相关问题