如何在python中检测算术溢出?

时间:2015-11-08 12:02:53

标签: python floating-point

我正在研究python中的分析问题,我必须处理大floating点数并且正在执行一些操作。我的代码似乎介于两者之间;仔细观察我发现有时一个简单的添加操作会返回inf它必须是溢出。

>>> a = float(2**1022) + float(2**1023)
>>> print a
1.348269851146737e+308
>>> a = float(2**1023) + float(2**1023)
>>> print a
inf
>>>

我们如何在浮点运算时检查python中的overflow,因为它不是给OverflowError而是静默给出值inf

3 个答案:

答案 0 :(得分:2)

我只能想象检查if abs(a)==float('inf'): raise OverflowError() ...

答案 1 :(得分:2)

使用像GMPY这样的任意精度库,您无需担心。

答案 2 :(得分:1)

免责声明:我维持gmpy2。

gmpy2库支持任意精度(以减少溢出的发生)和捕获浮点事件的能力。下面是修改上下文以在发生溢出时自动引发异常的示例。

>>> import gmpy2
>>> from gmpy2 import get_context,set_context, ieee, mpfr
>>> set_context(ieee(64))
>>> get_context()
context(precision=53, real_prec=Default, imag_prec=Default,
        round=RoundToNearest, real_round=Default, imag_round=Default,
        emax=1024, emin=-1073,
        subnormalize=True,
        trap_underflow=False, underflow=False,
        trap_overflow=False, overflow=False,
        trap_inexact=False, inexact=False,
        trap_invalid=False, invalid=False,
        trap_erange=False, erange=False,
        trap_divzero=False, divzero=False,
        trap_expbound=False,
        allow_complex=False)
>>> get_context().trap_overflow=True
>>> get_context()
context(precision=53, real_prec=Default, imag_prec=Default,
        round=RoundToNearest, real_round=Default, imag_round=Default,
        emax=1024, emin=-1073,
        subnormalize=True,
        trap_underflow=False, underflow=False,
        trap_overflow=True, overflow=False,
        trap_inexact=False, inexact=False,
        trap_invalid=False, invalid=False,
        trap_erange=False, erange=False,
        trap_divzero=False, divzero=False,
        trap_expbound=False,
        allow_complex=False)
>>> mpfr(2**1023) + mpfr(2**1023)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
gmpy2.OverflowResultError: 'mpfr' overflow in "addition"
>>>