如何得到 NaN 时,我除以零

当我在 Python 中进行浮点除法时,如果我除以零,就会得到一个异常:

>>> 1.0/0.0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: float division

我真的希望得到 NaNInf(因为 NaNInf将正确地传播通过我的计算的其余部分,而不会杀死我的程序)。

我怎么能这么做?

59632 次浏览

获得这种行为的最简单方法是使用 numpy.float64而不是 Python 默认的 float类型:

>>> import numpy
>>> numpy.float64(1.0) / 0.0
inf

当然,这需要 NumPy。您可以使用 numpy.seterr()来微调错误处理。

方法一:

try:
value = a/b
except ZeroDivisionError:
value = float('Inf')

方法二:

if b != 0:
value = a / b
else:
value = float('Inf')

但是要注意,这个值也可以是 -Inf,所以您应该做一个更加独特的测试。尽管如此,上面的内容应该会给你一些如何做到这一点的想法。

你可以尝试使用“十进制”模块:

>>> from decimal import *
>>> setcontext(ExtendedContext)
>>> inf = Decimal(1) / Decimal(0)
>>> print(inf)
Infinity
>>> neginf = Decimal(-1) / Decimal(0)
>>> print(neginf)
-Infinity
>>> print(neginf + inf)
NaN
>>> print(neginf * inf)
-Infinity
>>> print(dig / 0)
Infinity

如果我能正确理解你的问题,那么这就是解决方案:

try:
1.0/0.0
except:
return 'inf'

您可以根据各种可用的 Python 异常处理方法修改它

我在自己的一个 python 程序中使用了一个包装函式,当我使用的传感器没有插上电源时,它会返回 ZerodivisionError。它只返回0(零) ,在现实世界中,这正是我想要的。可能会因为更多的变量而变得混乱,但是..。

def calculation(a, b):
if a == 0:
return 0
elif b == 0:
return 0
else:
return a/b