2011-09-24 10 views
5

Tengo varias funciones con múltiples cálculos que podrían regresar inf, así:Python: ¿Devuelve flotación máxima en lugar de infs?

In [10]: numpy.exp(5000) 
Out[10]: inf 

prefiero que devolver el valor máximo de flotación:

In [11]: sys.float_info.max 
Out[11]: 1.7976931348623157e+308 

que podría poner en cheques por cada vez un inf puede aparecer, o ajustar cada cálculo en una función que redondea inf hasta el flotante deseado. Sin embargo, realmente me gustaría un truco simple al comienzo de cada función, como:

inf = sys.float_info.max 

Lo que, obviamente, no funciona. ¿Hay alguna manera inteligente de hacer esto? Gracias!

+2

¿Por qué? (Caracteres adicionales) – Benjamin

+0

Creo que esto es solo pedir problemas numéricos. ¿A dónde vas con esto? – NPE

+0

aix, tienes razón. El problema se debió a 'inf/inf' produciendo' nan', en lugar de '1', que era un problema. Ahora he reorganizado esos cálculos particulares para que no ocurran tales explosiones, eliminando así mi necesidad del hack 'inf'. ¡Gracias! – jeffalstott

Respuesta

3

Se puede utilizar un decorator:

import sys 
def noInf(f): 
    def wrapped(*args, **kwargs): 
    res = f(*args, **kwargs) 
    if res == float('inf'): 
     return sys.float_info.max 
    return res 
    return wrapped 

@noInf 
def myMult(x, y): 
    return x*y 

print(myMult(sys.float_info.max, 2)) # prints 1.79769313486e+308 
2

no sé acerca de 'sustitución' valor infinito, pero lo que sobre el uso de min()? Algo así como (suponiendo x cede su valor):

return min ([ x, sys.float_info.max ]) 
Cuestiones relacionadas