【问题标题】:Does Python define the value of "NaN > 0"?Python 是否定义了“NaN > 0”的值?
【发布时间】:2013-12-24 16:57:06
【问题描述】:

Python 是否定义了“NaN > 0”的值?在我的 Python 解释器中,我得到:

>>> float('nan') > 0
False

但这能保证吗?

如果我理解正确,IEEE 754 标准分配了False to any comparison involving NaN。但是,我在 Python 文档中找不到任何表明遵循此标准的内容。我什至明白1/0 在 IEEE 754 下应该给出无穷大,但 Python 引发了一个异常 (ZeroDivisionError),因此 Python 并不完全遵循 IEEE 754。

那么,float('nan') > 0 的结果是否完全在 Python 中定义?我需要知道它是否在所有平台上以及所有版本的 Python(包括旧版本)上都相同。

【问题讨论】:

  • 我认为 Python 中的 NaN 文档不足。这有点暗示它们是 IEEE 754,但似乎没有明确规定。

标签: python nan comparison-operators


【解决方案1】:

我认为这是一个非常安全的假设。 math library 文档暗示 python 的 NaN应该按照 IEEE 754 的规定行事。

当然,如果你真的很偏执,你可以编写一个 UnitTest,然后如果你确实找到了一个不适用的系统,至少你会立即知道。

【讨论】:

  • 数学库的含义并不比 Python 中 float('nan') 的存在要多...问题实际上是关于对 NaN 的 多少 支持,包括NaN > 0 的结果的定义(或不​​定义)。我认为 NPE 确定了这一点:官方不保证完全支持。
  • @EOL -- 我不是这么读的。 “有关 NaN 的更多信息,请参阅 IEEE 754”。对我来说,这就是说,NaN 的行为就像它在 IEEE 754 中一样。
  • 很公平。但是,我知道 NaN 是一个 IEEE 754 概念,所以 float('nan') 隐含地引用了 IEEE 754,不是吗?
【解决方案2】:

我在各种平台上使用的所有 Python 实现都使用 IEEE-754,并且会按照您的描述运行。

但是,该语言似乎并未正式规定这一点。以至于tutorial 有以下话要说(强调我的):

几乎今天(2010 年 7 月)所有机器都使用 IEEE-754 浮点运算,并且几乎所有平台都将 Python 浮点数映射到 IEEE-754“双精度”。

这是 2008 年的相关主题:Python on non IEEE-754 platforms: plea for information

很容易检查您的解释器/平台的行为是否符合您的预期。如果您非常依赖这一点,则可以在程序启动时轻松检测到不合规情况。

【讨论】:

    【解决方案3】:

    link 表明,NaN 概念从 2.3 版开始被纳入 python。所以在当前使用的版本中应该在所有平台上都是一样的。

    它在math 库中也有一个实现。

    例如math.isnan()

    Checks if the float x is a NaN (not a number).
    NaNs are part of the IEEE 754 standards. Operation like but not limited to
    inf * 0, inf / inf or any operation involving a NaN, e.g. nan * 1, return a NaN.
    
    
    New in version 2.6.
    
    >>> import math
    >>> x=float('nan')
    >>> math.isnan(x)
    True
    >>>
    

    【讨论】:

    • 真正的问题是 IEEE 754 兼容的 Python 是怎样的...... NPE 的回答非常准确:IEEE 754 不是语言强制要求的。
    猜你喜欢
    • 2012-12-31
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多