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
我对python中的nan != nan
感兴趣。只是为了澄清,我知道nan
应该按照定义行事,我问的是如何而不是为什么。实施的地方在哪里?是否还有其他任何行为?
答案 0 :(得分:4)
不是数字(NaN)与任何东西不相等。要检测它,请使用math.isnan
。像这样的对象很容易定义:
class A(object):
def __eq__(self, other):
return False
def __ne__(self, other):
return True
之所以这么简单。 CPython遵循IEEE 754标准进行浮点数学运算。 NaN是一个浮点值,IEEE 754规定它不等于任何其他浮点值。
答案 1 :(得分:3)
实现浮点运算的机器代码处理NaN操作的结果。对于x86处理器系列,这通常使用x87协处理器指令来实现,但对于早期x86协处理器并不总是存在的早期x86处理器,编译器通常提供仿真代码。
答案 2 :(得分:3)
对于问题的“where”部分,请从Python 2.7.3源代码树的Objects / floatobject.c中的第391行开始。下面简要讨论NaN == NaN的行为与实现如下。
对于表现出类似行为的其他案件,肯定是可能的。然而,我没有对这些库进行详尽的搜索,所以我无法给出明确的答案。