【问题标题】:How are Inf and NaN implemented?Inf 和 NaN 是如何实现的?
【发布时间】:2017-12-05 12:04:19
【问题描述】:

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

【问题讨论】:

  • 因为用于比较的浮点机器指令在将 nan 与任何事物(包括其自身)进行比较时返回 false
  • 这与IEEE 754 标准有关。
  • 几乎所有编程语言都将 IEEE 754 用于浮点值,它精确地定义了这些特殊值是什么、它们如何表示以及它们在各种操作中的行为方式。
  • 现代 cpu:s 对此有支持。它不需要“实施”
  • 请阅读相当经典的论文wrt数学:lsi.upc.edu/~robert/teaching/master/material/p5-goldberg.pdf

标签: python nan infinity


【解决方案1】:

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

【讨论】:

  • 我认为提及用于比较浮点数的硬件指令是有用的,旨在指示两个操作数如果其中一个是 NaN 则不相等,即使它们具有相同的位模式。作者的问题表明他们可能认为相同的位模式必然表示相等,或者至少他们不明白如何可以说相同的位模式不相等。
  • 感谢您的回答。这对我来说很有意义。
  • @EricPostpischil:这听起来一点用都没有,它只会复制您评论中的信息。下次,如果您有对提问者有用的信息,请提出修改建议或针对提问者发表评论。
【解决方案2】:

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

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

一个指定的而不是微不足道的行为,NaN != 一切,包括它自己。

知道了,你可以写如下:

def isNaN(f): return f != f

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-24
    • 2014-05-03
    • 2010-12-27
    • 2018-01-26
    • 2010-10-13
    • 2012-11-08
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多