关于python:当我除以零时如何得到NaN

How to get NaN when I divide by zero

在python中进行浮点除法时,如果除以零,则会得到一个异常:

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

我真的想让NaNInf代替(因为NaNInf将正确地通过我的其余计算进行传播,而不是杀死我的程序)。

我该怎么做?


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

1
2
3
>>> import numpy
>>> numpy.float64(1.0) / 0.0
inf

当然,这需要麻木。您可以使用numpy.seterr()对错误处理进行微调。


方法1:

1
2
3
4
try:
    value = a/b
except ZeroDivisionError:
    value = float('Inf')

方法2:

1
2
3
4
if b != 0:
    value = a / b
else:
    value = float('Inf')

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


您可以尝试使用"十进制"模块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> 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

如果我正确理解您的问题,那么这应该是解决方案:

1
2
3
4
try:
   1.0/0.0
except:    
   return 'inf'

您可以根据各种可用的python异常处理方法对其进行修改。


我在我的python程序中使用了一个包装函数来做一个简单的除法,当我使用的传感器没有插入时,这个除法返回零除法错误。它只返回0(零),这在现实世界中是我想要的。但是,可能会因为更多的变量而变得混乱…

1
2
3
4
5
6
7
def calculation(a, b):
    if a == 0:
        return 0
    elif b == 0:
        return 0
    else:
        return a/b