2015-11-08 3 views
3

Я работаю над проблемой анализа в python, в которой мне приходится работать с большими номерами floating и выполнял некоторые операции над ним. Мои коды, кажется, разрываются между ними; глядя, что я обнаружил, что иногда простая операция добавления возвращает inf, это должно быть переполнение.Как обнаружить переполнение при арифметике в python?

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

Как мы проверить overflow в питона в то время как операция с плавающей запятой, так как вместо того, чтобы дать OverflowError он молча дает значение inf.

ответ

2

Я могу только представить себе, проверяя if abs(a)==float('inf'): raise OverflowError() ...

2

Используйте произвольную точность библиотеку как GMPY и вам не нужно будет беспокоиться.

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