Inf和NaN是如何实施的?

cs9*_*s95 11 python nan infinity

由于数学概念,我清楚地知道什么infnan实际上都是.但我真正感兴趣的是如何在编程语言中实现它们.

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

>>> nan = float('nan')
>>> inf = float('inf')
>>> 1 + inf
inf
>>> inf + inf
inf
>>> inf - inf
nan
Run Code Online (Sandbox Code Playgroud)

这将使我相信python内部对这两个数学量有一个特殊的保留位序列,没有其他数字可以假设这些位置.我的假设是否正确?能否请你在这方面给我启发?

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

>>> inf == inf
True
Run Code Online (Sandbox Code Playgroud)

但是,这不是:

>>> nan == nan
False
Run Code Online (Sandbox Code Playgroud)

显然,在数学中,这是正确的答案.但是python如何知道它应该False在这个实例中吐出来?

此外,python的实现与java或c ++的实现有何不同?

Die*_*Epp 9

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


joh*_*n d 5

Those are not python-specific behavior, it's rather the floating-point standard Python use (and possibly all common languages?).

naninfIEEE_754浮点标准的特殊值。它们当然具有内部表示(您提到的位序列),但是它们的行为并不常见。对于其他浮点值,此行为并不常见,但IEEE_754已对其进行了很好的定义。实现在指令级别处理。(处理器在其浮点单元电路中进行处理)

NaN!=是一种指定的而非琐碎的行为,NaN!=所有事物,包括其自身。

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

def isNaN(f): return f != f
Run Code Online (Sandbox Code Playgroud)