【问题标题】:Getting FloatingPointError instead of ZeroDivisionError when dividing by zero除以零时获取 FloatingPointError 而不是 ZeroDivisionError
【发布时间】:2017-12-23 01:37:26
【问题描述】:

我正在 Python 中运行一个非常耗时的后处理器,并且遇到了 FloatingPointError,而我期待的是 ZeroDivisionError

我的代码在try except 语句中捕获了ZeroDivisionError 的可能性:

try: a = b / abs(c) 
except ZeroDivisionError: a = 'divZero'

但是,我收到以下错误:

FloatingPointError: divide by zero encountered in divide

为什么会出现这个错误?

【问题讨论】:

  • bc 的值是多少?
  • 是的,尝试打印c。它可能不是0,而是由于数字错误而导致的一些非常小的数字。
  • c0.0。如果不再次运行代码,我将无法确切知道 b 是什么,这需要一点时间,但它是从数组中获取的浮点数(例如 43.3E3/2
  • 如果没有 bc 的值,我们无法重现此内容
  • 比值更重要的是,请显示bc类型(例如,print(type(b)) 显示什么?)。我强烈怀疑bc 中至少有一个是NumPy 标量而不是常规Python float

标签: python floating-point division


【解决方案1】:

如果发生这种情况:

  • 您正在使用 numpy,并且
  • 您将divisionerror state 设置为error

由于您已声明您已从数组中获取数字,因此看起来很可能是 numpy 版本。您可以使用numpy.geterr() 检查错误状态。您可能在代码中的某处调用了 numpy.seterr()numpy.errstate(),或者您正在使用的库有。

例如,您可以获得FloatingPointError,如下所示:

In [22]: np.seterr(divide="raise")
Out[22]: {'divide': 'raise', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}

In [24]: b = np.float32(1)

In [25]: c = np.float32(0)

In [26]: a = b / c
---------------------------------------------------------------------------
FloatingPointError                        Traceback (most recent call last)
<ipython-input-26-809085b5049b> in <module>()
----> 1 a = b / c

FloatingPointError: divide by zero encountered in float_scalars

如果 bc 是 numpy 整数而不是浮点数,则 float_scalars 将改为 short_scalars。请注意,numpy 对象 从不 会导致 ZeroDivisionError。如果您有错误状态divide='ignore'divide='warn',则a / 0 的结果将为infa // 0 的结果将为0

虽然我无法重现您的 exact 错误消息,但这可能是由于 numpy 的不同版本造成的(我在 1.14.5 上)。

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多