我正在研究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
。
答案 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"
>>>