2017-02-16 2 views
0

math.ldexp(0.5, 1025) résultats dans OverflowError. La fonction équivalente de Numpy renvoie inf. De l'autre côté, cependant, math.ldexp(0.5, -1074) ne soulève pas une exception, mais renvoie plutôt 0.0, comme illustré ci-dessous:Pourquoi `math.ldexp` soulève OverflowError pour exponent> 1024, mais pas pour exponent <-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 

Pourquoi Python raiso un OverflowError lorsque l'exposant est trop grand, mais pas quand il est trop petit ? Y at-il une raison valable, ou cela devrait-il être considéré comme un bug?

+2

Le point flottant est une représentation inexacte. '0.0' est la représentation inexacte la plus proche de' math.ldexp (0.5, -1074) '. Il n'y a pas de représentation en virgule flottante correspondante pour 'math.ldexp (0.5, 1025)'. –

+1

Un exposant trop petit est * underflow *, pas * overflow *. –

+0

@StevenRumbalski Le point flottant et 'math.ldexp (a, b)' sont des représentations exactes de tout nombre pouvant être écrit comme 'a * 2 ** b' ... – gerrit

Répondre

3

L'arithmétique à virgule flottante IEEE est connue pour avoir un certain degré d'imprécision. 0.0 est une valeur très proche de math.ldexp(0.5, -1074). Cependant, il n'y a pas de moyen valable d'exprimer une valeur proche de math.ldexp(0.5, 1025), donc je suppose que c'est la raison pour laquelle elle déclenche une exception.