Inf 和 NaN 是如何实现的?
How are Inf and NaN implemented?
作为数学概念,我很清楚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++ 的实现有何不同?
这些不是 python 特定的行为,而是 Python 使用的浮点标准(可能还有所有通用语言?)。
nan
和 inf
是 IEEE_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 或汇编语言中的数字,您都会得到相同的结果。
作为数学概念,我很清楚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++ 的实现有何不同?
这些不是 python 特定的行为,而是 Python 使用的浮点标准(可能还有所有通用语言?)。
nan
和 inf
是 IEEE_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 或汇编语言中的数字,您都会得到相同的结果。