2011-09-24 13 views
5

Ho diverse funzioni con calcoli multipli che potrebbero tornare inf, in questo modo:Python: restituisce il float massimo invece di infs?

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

Preferirei che restituire il valore float massima:

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

ho potuto mettere in assegni per ogni volta potrebbe apparire un inf o avvolgere ciascun calcolo in una funzione che arrotonda il valore inf al valore float desiderato. Tuttavia, mi piacerebbe davvero come un semplice trucco all'inizio di ogni funzione, come:

inf = sys.float_info.max 

che ovviamente non funziona. C'è un modo intelligente per farlo? Grazie!

+2

Perché? (caratteri extra) – Benjamin

+0

Penso che questo sia solo per chiedere problemi numerici. Dove stai andando con questo? – NPE

+0

aix, hai ragione. Il problema era dovuto al fatto che 'inf/inf' produceva' nan', invece di '1', che rappresentava un problema. Ora ho riorganizzato quei calcoli particolari in modo tale che non succedano tali esplosioni, eliminando così il mio bisogno di "inf" hack. Grazie! – jeffalstott

risposta

3

È possibile utilizzare 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

non so di 'sostituzione' valore infinito, ma per quanto riguarda utilizzando min()? Qualcosa di simile (supponendo x cede il vostro valore):

return min ([ x, sys.float_info.max ]) 
Problemi correlati