2013-09-30 15 views
12

Devo usare la funzione Python math.log(x) con valori di x da (0, ..., 1). A volte x potrebbe essere troppo vicino allo zero, e Python mi dà un errore:errori di dominio matematico python nella funzione math.log

ValueError: math domain error

Come faccio a sapere, che cosa è il dominio di definizione di math.log funzione?

risposta

11

Finché il vostro ingresso è entro l'intervallo semiaperto (0, 1] (escluso lo 0), si sta bene Non si può essere troppo vicino allo zero:.

>>> math.log(sys.float_info.min) 
-708.3964185322641 

Così semplicemente controllando esattamente zero (forse come il risultato di un underflow) dovrebbe essere sufficiente, o in alternativa prendere l'eccezione e gestirlo

EDIT:. Ciò vale anche per il minimo denormal numero a virgola mobile:

012.351.641.061.
+0

Questo è quello che pensavo, ma mentre 'sys.float_info.min = 2.2250738585072014e-308', posso ancora fare' math.log (2e-318) 'sul mio sistema (e ottenere' -731.5289 .. .' come risposta). Cosa succede con quello? – Evert

+0

@Evert: è un ["numero normale"] (http://en.wikipedia.org/wiki/Denormal_number) e possono effettivamente essere la causa del tuo problema. –

+0

Ah, ho imparato qualcosa. Sospettavo che "epsilon" fosse coinvolto, ma sono comunque sorpreso che in realtà lanci una risposta corretta per 'math.log (5e-324)', anche se è un underflow. È ora di leggere [Wikipedia su questo] (http://en.wikipedia.org/wiki/Double-precision_floating-point_format). – Evert

4

Si sta verificando la precisione supportata, utilizzare invece la classe Decimal.

>>> from math import log 
>>> from decimal import Decimal 

>>> d = Decimal('1E-1024') 
>>> log(d) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
ValueError: math domain error 
>>> d.ln() 
Decimal('-2357.847135225902780434423250')