2012-04-04 44 views
38

分当我做浮点除法在Python,如果我除以零,我得到一个异常:如何获得NaN当我由零

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

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

我该怎么做?

+3

实际上'NaN'或'Inf'除以零? – beerbajay 2012-04-04 13:13:00

+8

@beerbajay:'0.0/0.0' - >'nan','1.0/0.0' - >'inf','-1.0/0.0' - >'-inf'。 – 2012-04-04 13:14:09

+0

其实非常有趣的是改变Python的行为,所以它真的适用于'1.0/0',没有明确地重新输入所有内容或放任何东西 - 除了在任何地方。 – Fenikso 2012-04-04 13:30:18

回答

48

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

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

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

+0

这很好。您甚至可以将'numpy.float64'值传递给SWIG封装的C库,没有任何问题。 – 2012-04-04 20:23:17

+1

什么甚至有'浮(“INF”)'和'浮动(“男”)'内置于Python的,如果你有使用第三方库,以获得预期的行为的意义呢?也就是说,看起来像显式输入'float('inf')'是唯一一次我可以依靠看到Python返回的'inf'结果。 – Brandin 2016-01-18 14:18:11

+0

第一次运行这个时,它会抛出一个错误。 – becko 2017-11-24 13:40:30

19

方法1:

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

方法2:

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

但要知道,该值可能也被-Inf,因此你应该做一个比较有特色的测试。尽管如此,上面的这个应该会让你知道如何去做。

+0

我发现新的'math.inf'有点更好阅读。 – 2016-02-16 22:25:13

+0

@NeilG如果有的话,当然。早在2012年它就不存在了...... – glglgl 2016-02-17 07:07:24

+0

哦!不知何故,我认为这是一个新问题。无论如何,它的版本为3。5 – 2016-02-17 07:23:37

6

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

>>> 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 
-3

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

try: 
    1.0/0.0 
except:  
    return 'inf' 

你可以根据不同的Python异常修改了它可用的处理方法

+6

更好的'float('inf')'而不是'inf'' - 那么你会得到一个浮点数,而不是字符串... – glglgl 2012-04-05 10:59:20

+8

除ZeroDivisionError之外的更好的'',''除了''''''也能捕获'KeyboardInterrupt'等。 – Marian 2012-11-07 13:34:55

-4

我在我的一个蟒程序中使用的包装函数的简单除法这是返回ZeroDivisionError当传感器我使用没有插入。它只是返回0(零),这在现实世界中是我想要的。可能会有更多的变量杂乱,但是...

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

对不起,我忘了修改这个问题,但你所要做的就是将零改为“NaN”我相信。 – 2015-07-15 15:17:55

+0

这不是一个通用的解决方案。例如。我不希望a/0.0给0,我也不期望它给NaN。 – Brandin 2016-01-18 14:55:05