Python Inf和NaN是如何实现的?

Python Inf和NaN是如何实现的?,python,nan,infinity,Python,Nan,Infinity,作为数学概念,我很清楚inf和nan实际上是什么。但我真正感兴趣的是它们是如何在编程语言中实现的 在python中,我可以在算术和条件表达式中使用inf和nan,如下所示: >>> nan = float('nan') >>> inf = float('inf') >>> 1 + inf inf >>> inf + inf inf >>> inf - inf nan 这会让我相信python内部对这两个数

作为数学概念,我很清楚
inf
nan
实际上是什么。但我真正感兴趣的是它们是如何在编程语言中实现的

在python中,我可以在算术和条件表达式中使用
inf
nan
,如下所示:

>>> nan = float('nan')
>>> inf = float('inf')
>>> 1 + inf
inf
>>> inf + inf
inf
>>> inf - inf
nan
这会让我相信python内部对这两个数学量有一个特殊的保留位序列,没有其他数字可以假设这些位置。我的假设正确吗?你能在这方面给我一些启发吗

如果我的假设是正确的,那么这可以很容易地解释:

>>> inf == inf
True
然而,这不是:

>>> nan == nan
False
显然,在数学中,这是正确的答案。但是python怎么知道在这个例子中应该抛出
False


此外,Python的实现与java或C++的不同之处是什么?

< p>这些不是Python特定的行为,而是浮点标准Python使用(可能是所有的通用语言)。
nan
inf
是浮点标准的特殊值。 当然,它们有内部表示(您提到的位序列),但它们的行为并不常见。 这种行为与其他浮点值不同,但IEEE_754对其进行了很好的定义。实现是在指令级处理的。(处理器在其浮点单元电路中处理此问题)

一个特定且不平凡的行为,NaN!=一切,包括它自己

知道了这一点,您可以编写如下内容:

def isNaN(f): return f != f

通常,浮点运算直接由硬件实现。对于无穷大和NaN,确实存在特殊的位模式,硬件浮点单元可以识别这些位模式

IEEE 64位浮点数是CPython在典型系统中使用的一种,符号为1位,指数为11位,尾数为52位。看


如果指数包含0B11111111(全部为1),则数字为inf或nan,具体取决于尾数中存储的内容。Python不需要做任何特殊的事情来处理这些情况。无论您是用Python、C、Java还是汇编语言比较数字,都会得到相同的结果。

因为用于比较的浮点计算机指令在将nan与任何东西(包括nan本身)进行比较时返回false。这与标准有关。几乎所有编程语言都使用IEEE 754作为浮点值,它精确地定义了这些特殊值是什么,它们是如何表示的,以及它们在各种操作中的行为。现代cpu:s对此有支持。它不需要“实现”,请阅读相当经典的论文wrt FP math:我认为提及用于比较浮点数的硬件指令是非常有用的,它旨在指示两个操作数不相等,如果其中任何一个是NaN,即使它们具有相同的位模式。作者的问题表明,他们可能认为相同的位模式必然意味着相等,或者至少他们不理解相同的位模式如何可以说是不相等的。谢谢你的回答。这对我来说是有意义的。@EricPostPhischil:这听起来一点用都没有,只是重复了你评论中的信息而已。下一次,如果你有对提问者有用的信息,建议编辑或发表针对提问者的评论。