2017-02-16 1 views
0

math.ldexp(0.5, 1025) Результаты OverflowError. Эквивалентная функция Numpy возвращает inf. С другой стороны, однако, math.ldexp(0.5, -1074) не вызывает исключение, а возвращает 0.0, как показано на рисунке ниже:Почему `math.ldexp` поднимает OverflowError для экспоненты> 1024, но не для экспоненты <-1073?

In [275]: math.ldexp(0.5, 1024) 
Out[275]: 8.98846567431158e+307 

In [276]: math.ldexp(0.5, 1025) 
--------------------------------------------------------------------------- 
OverflowError        Traceback (most recent call last) 
<ipython-input-276-ce1573e0249b> in <module>() 
----> 1 math.ldexp(0.5, 1025) 

OverflowError: math range error 

In [277]: math.ldexp(0.5, -1073) 
Out[277]: 5e-324 

In [278]: math.ldexp(0.5, -1074) 
Out[278]: 0.0 

Почему Python raiso в OverflowError, когда показатель является слишком большим, но не тогда, когда он слишком мал ? Есть ли веская причина, или это следует считать ошибкой?

+2

Плавающая точка - неточное представление. '0.0 является ближайшим неточным представлением для' math.ldexp (0.5, -1074) '. Не существует соответствующего представления с плавающей запятой для 'math.ldexp (0.5, 1025)'. –

+1

Слишком маленький показатель - это * underflow *, not * overflow *. –

+0

@StevenRumbalski Плавающая точка и 'math.ldexp (a, b)' являются точными представлениями для любого числа, которое может быть записано как 'a * 2 ** b' ... – gerrit

ответ

3

Арифметика с плавающей запятой IEEE, как известно, имеет некоторую степень неточности. 0.0 - это значение, которое очень близко к math.ldexp(0.5, -1074). Однако нет действительного способа выражения значения, которое близко к math.ldexp(0.5, 1025), поэтому я бы предположил, что именно поэтому он вызывает исключение.

Смежные вопросы