6
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> x = float('nan')
>>> id(x) == id(x)
True
>>> x == x
False

我对如何nan != nan使用 python 很感兴趣。为了澄清起见,我知道nan根据定义应该表现得像那样,我问的是为什么而不是为什么。这是在哪里实施的?是否还有其他类似行为的对象?

4

3 回答 3

5

Not A Number (NaN) 不等于任何东西。要检测它,请使用math.isnan. 像这样的对象很容易定义:

class A(object):
    def __eq__(self, other):
        return False

    def __ne__(self, other):
        return True

原因很简单。CPython 遵循 IEEE 754 浮点数学标准。NaN 是一个浮点值,IEEE 754 规定它不等于任何其他浮点值。

于 2012-10-21T23:24:02.960 回答
3

实现浮点运算的机器代码使用 NaN 处理运算结果。对于 x86 处理器系列,这通常是使用 x87 协处理器指令来实现的,尽管对于早期的 x86 处理器,x87 协处理器并不总是存在,编译器通常会提供仿真代码。

于 2012-10-21T23:29:22.310 回答
3

对于您问题的“位置”部分,请查看 Python 2.7.3 源代码树中 Objects/floatobject.c 中的第 391 行。简要讨论了 NaN == NaN 的行为,实现如下。

对于其他表现出类似行为的情况,这当然是可能的。但是,我还没有对图书馆进行详尽的搜索,所以我无法给出明确的答案。

于 2012-10-21T23:38:48.623 回答