作为数学概念,我很清楚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 ++的实现有何不同?
答案 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使用的浮点标准(可能是所有常用语言?)。
nan
和inf
是IEEE_754浮点标准的特殊值。
他们当然有内部表示(你提到的位序列),但他们的行为并不常见。
其他浮点值的行为并不常见,但它由IEEE_754很好地定义。实施在指令层面处理。 (处理器在其浮点单元电路中处理它)
一种指定而非琐碎的行为,NaN!=一切,包括其本身。
知道这一点,你可以这样写:
def isNaN(f): return f != f