Inf 和 NaN 是如何实现的?

How are Inf and NaN implemented?

作为数学概念,我很清楚infnan到底是什么。但我真正感兴趣的是它们是如何用编程语言实现的。

在python中,我可以在算术和条件表达式中使用infnan,像这样:

>>> 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++ 的实现有何不同?

这些不是 python 特定的行为,而是 Python 使用的浮点标准(可能还有所有通用语言?)。

naninfIEEE_754 浮点标准的特殊值。 他们当然有内部表示(你提到的位序列),但他们的行为并不常见。 该行为与其他浮点值不同,但由 IEEE_754 明确定义。实现是在指令级处理的。 (处理器在其浮点单元电路中处理此问题)

一个指定的且不是微不足道的行为,NaN != 一切,包括它本身。

知道这一点,你可以这样写:

def isNaN(f): return f != f

通常情况下,浮点运算直接由硬件实现。 infinity和NaN确实有特殊的位模式,硬件浮点单元可以识别。

IEEE 64 位浮点数,典型系统上 CPython 中使用的那种,有 1 位符号,11 位指数,52 位尾数。参见 https://en.wikipedia.org/wiki/Double-precision_floating-point_format

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