Python中Inf与NaN的正确判断方法详解

周叙
周叙
发布时间:2026-10-13 | 4人浏览过
原创

本文详解Python中正负无穷(Inf)与非数值(NaN)的判断方法。指出使用is和==运算符判断NaN时存在反直觉行为,推荐优先使用math模块的isinf和isnan函数进行准确判断,并介绍了利用对象自身不等性及numpy模块处理数组的技巧。

在Python中,可以通过特定方式表示正无穷和负无穷。

float("inf") # 正无穷
float("-inf") # 负无穷

将 inf(infinite) 乘以 0 会生成 not-a-number(NaN)。当一个数值超出无限范围时,它属于 NaN(not a number)。在 NaN 的底层表示中,其 exponent 部分取可表达的最大值,即单精度的 FF、双精度的 7FF 以及扩展双精度的 7FFF。NaN 与 infinite 的主要区别在于 significand 部分:infinite 数的 significand 为 0(扩展双精度下 bit63 位为 1),而 NaN 数的 significand 不为 0。

首先观察以下代码示例:

>>> inf = float("inf")
>>> ninf = float("-inf")
>>> nan = float("nan")
>>> inf is inf
True
>>> ninf is ninf
True
>>> nan is nan
True
>>> inf == inf
True
>>> ninf == ninf
True
>>> nan == nan
False
>>> inf is float("inf")
False
>>> ninf is float("-inf")
False
>>> nan is float("nan")
False
>>> inf == float("inf")
True
>>> ninf == float("-inf")
True
>>> nan == float("nan")
False

若未在 Python 中尝试判断浮点数是否为 NaN,上述输出结果可能令人意外。对于正负无穷和 NaN,使用 is 运算符与自身比较均返回 True,这看似正常;但使用 == 运算符时,NaN 与自身的比较结果为 False。若分别用 float 重新定义变量并与原变量进行 is 和 == 比较,结果同样出乎意料。这一现象原因较为复杂,此处不再赘述,感兴趣者可查阅相关底层资料。

若需准确判断 Inf 和 Nan 值,应使用 math 模块提供的 math.isinf 和 math.isnan 函数:

>>> import math
>>> math.isinf(inf)
True
>>> math.isinf(ninf)
True
>>> math.isnan(nan)
True
>>> math.isinf(float("inf"))
True
>>> math.isinf(float("-inf"))
True
>>> math.isnan(float("nan"))
True

如此操作即可确保结果准确。鉴于此问题的特殊性,特此提醒:请勿在 Python 中尝试使用 is 和 == 来判断对象是否为正负无穷或 NaN,建议严格使用 math 模块,以免引发不必要的错误。

当然存在其他判断方法,以下以 NaN 为例进行说明,但仍强烈推荐使用 math 模块,以避免逻辑混淆。

利用对象自身与自身不相等的特性进行判断

>>> def isnan(num):
...  return num != num
... 
>>> isnan(float("nan"))
True

借助 numpy 模块提供的函数

>>> import numpy as np
>>> 
>>> np.isnan(np.nan)
True
>>> np.isnan(float("nan"))
True
>>> np.isnan(float("inf"))
False

Numpy 的 isnan 函数支持对整个 list 进行批量判断:

>>> lst = [1, float("nan"), 2, 3, np.nan, float("-inf"), 4, np.nan]
>>> lst
[1, nan, 2, 3, nan, -inf, 4, nan]
>>> np.isnan(lst)
array([False, True, False, False, True, False, False, True], dtype=bool)

上述 np.isnan 返回一个布尔值数组,若对应位置元素为 NaN,则返回 True,否则返回 False。

总结

以上内容为本文全部介绍,希望能为读者的学习或工作提供有益参考。如有任何疑问,欢迎留言交流。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表