Floating point NaN!=南?

Floating point NaN!=南?,floating-point,nan,ieee-754,Floating Point,Nan,Ieee 754,据我所知,IEEE将NaN定义为在浮点数系统中不等于自身。我唯一需要比较NaN和NaN的是比较数据帧条目,在这种情况下,NaN的这个属性实际上是一个很大的麻烦 我只是想知道为什么决定使NaN不等于它自己,而不是其他空值。(例如,在python中与None类似。)IEEE 754定义了一个浮点算术系统。它的相等运算符测试两个数字是否相等。(这与测试两个对象是否相同不同。)NaN表示的不是数字。两个“N”可以相同,但它们不能是相等的数字,因为它们不是数字 这一点很重要的一个原因是,NaN用于传递操作

据我所知,IEEE将NaN定义为在浮点数系统中不等于自身。我唯一需要比较NaN和NaN的是比较数据帧条目,在这种情况下,NaN的这个属性实际上是一个很大的麻烦


我只是想知道为什么决定使NaN不等于它自己,而不是其他空值。(例如,在python中与None类似。)

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

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

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

类似地,如果当
x
y
中的一个或两个
x
y
为NaN时,我们为
x
x
分配结果,则浮点算法将得到错误的结果。如果一个操作数是NaN,那么我们想知道的答案是“其中哪个顺序是
x
y
?”是“我们不知道”。因此
x==y
x
x
当任一操作数是NaN时都返回false,浮点算法的设计必须考虑到这一点

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


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

可能重复的可能重复“与其他空值不同”,但语言在与空值进行比较的方式上有所不同。例如,C#非常奇怪。假设
x
y
都是可为空的整数,并且都是空的。在这种情况下
x==y
是真的,但
x记住,在数据库意义上,空值在逻辑上是“我不知道”。询问一个我不知道的量是否等于另一个我不知道的量?”应该会产生“我不知道”的答案,不是真的或假的,在某些语言中是这样的。VB有一个类似于IsNaN的“IsNull”辅助方法来检测NaN。出于同样的原因。这是否回答了您的问题?