相关疑难解决方法(0)

为什么NaN不等于NaN?

相关的IEEE标准定义了一个数字常量NaN(不是数字),并规定NaN应该比较为不等于它自己.这是为什么?

我熟悉的所有语言都实现了这个规则.但它经常会导致严重的问题,例如当NaN存储在容器中时,NaN存在于正在排序的数据中等时的意外行为等.更不用说,绝大多数程序员都希望任何对象都等于自身(在他们了解NaN之前,令人惊讶的是他们增加了错误和混乱.

IEEE标准经过深思熟虑,因此我确信NaN的比较与其本身相同是很糟糕的.我只是想不通它是什么.

language-agnostic floating-point nan ieee-754

114
推荐指数
5
解决办法
3万
查看次数

为什么在numpy`nan == nan`中是假的,而nan在[nan]中是真的?

虽然问题的第一部分(标题中)已经被回答了几次(即,为什么NaN不等于NaN?),我不明白为什么第二部分的工作方式(灵感)通过这个问题如何检查包含NaN的列表

即:

>> nan == nan
False

>> nan in [nan]
True
Run Code Online (Sandbox Code Playgroud)

考虑@DSM答案的问题的解释性附录.那么,为什么float("nan")表现与众不同nan?它不应该再次评估简单nan,为什么解释器这样做?

>> x = float("nan")
>> y = nan
>> x
nan
>> y
nan
>> x is nan, x is float("nan"), y is nan
(False, False, True)
Run Code Online (Sandbox Code Playgroud)

基本上,它nan在第一种情况下引用相同的泛型,但在第二种情况下创建单独的对象:

>> nans = [nan for i in range(2)]
>> map(id, nans)
[190459300, 190459300]
>> nans = [float("nan") for i in range(2)]
>> map(id, nans)
[190459300, 190459301]
Run Code Online (Sandbox Code Playgroud)

python numpy nan

33
推荐指数
1
解决办法
1万
查看次数