Inf和NaN是如何实施的?

时间:2017-07-01 19:59:27

标签: python nan infinity

作为数学概念,我很清楚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 ++的实现有何不同?

2 个答案:

答案 0 :(得分:7)

通常,浮点运算由硬件直接实现。确实存在无限和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还是汇编语言中的数字,都会得到相同的结果。

答案 1 :(得分:4)

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

naninfIEEE_754浮点标准的特殊值。 他们当然有内部表示(你提到的位序列),但他们的行为并不常见。 其他浮点值的行为并不常见,但它由IEEE_754很好地定义。实施在指令层面处理。 (处理器在其浮点单元电路中处理它)

一种指定而非琐碎的行为,NaN!=一切,包括其本身。

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

def isNaN(f): return f != f