当我除以零时如何获得NaN

Ken*_*oom 52 python

当我在Python中进行浮点除法时,如果我除以零,我得到一个例外:

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

我真的很想得到NaNInf代替(因为NaN或者Inf将通过我的计算的其余部分正确传播而不是杀死我的程序).

我怎样才能做到这一点?

Sve*_*ach 63

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

>>> import numpy
>>> numpy.float64(1.0) / 0.0
inf
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你必须使用第三方库来获得预期的行为,那么甚至在Python中内置`float('inf')`和`float('nan')`有什么意义呢?也就是说,似乎明确地输入`float('inf')`是唯一一次能够真正指望看到Python返回的'inf'结果. (6认同)
  • @becko:它打印一个警告,这与抛出错误完全不同。您可以使用内置的 `warnings` 模块控制警告。 (3认同)

glg*_*lgl 24

方法1:

try:
    value = a/b
except ZeroDivisionError:
    value = float('Inf')
Run Code Online (Sandbox Code Playgroud)

方法2:

if b != 0:
    value = a / b
else:
    value = float('Inf')
Run Code Online (Sandbox Code Playgroud)

但请注意,价值也可以-Inf,所以你应该做一个更独特的测试.不过,上面这个应该会让你知道如何做到这一点.


Spa*_*man 8

您可以尝试使用'decimal'模块:

>>> 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
Run Code Online (Sandbox Code Playgroud)