2013-09-30 18 views
12

Python math.log(x) işlevini x (0, ..., 1) değerleriyle kullanmalıyım. Bazen x sıfıra çok yakın olabilir, ve Python bana bir hata veriyor:python math etki alanı hataları, math.log işlevi

ValueError: math domain error

nasıl bilebilirim, math.log fonksiyonun tanımının alanı nedir?

cevap

11

Sürece giriş yarı açık aralık (0 içinde olduğu gibi, 1]() 0 dahil olmasın, gayet Sen sıfıra çok yakın olamaz.

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

Yani basitçe yeterli veya alternatif olarak özel durumu yakalamak ve işlemek gerekir (belki bir aşağı taşma sonucu) tam sıfır denetleme

DÜZENLEME. Bu aynı zamanda kayan nokta sayısı denormal az tutar:

>>> math.log(sys.float_info.min * sys.float_info.epsilon) 
-744.4400719213812 
+0

Ben öyle düşündüm, ama sys.float_info.min = 2.2250738585072014e-308' iken, hala sistemimde 'math.log (2e-318)' yapabilirim (ve -731.5289 olsun .. . ”yanıt olarak. Ne var ne yok? – Evert

+0

@Evert: Bu bir "" anormal sayı "] (http://en.wikipedia.org/wiki/Denormal_number), ve aslında sorunun nedenleri olabilir. –

+0

Ah, bir şey öğrendim. Ben epsilon 'oldu' şüphelenilen, ama hala bir underflow olsa bile, aslında 'math.log (5e-324)' için doğru bir cevap atar şaşırıyorum. Okumak için zaman [Bu Wikipedia] (http://en.wikipedia.org/wiki/Double-precision_floating-point_format). – Evert

4

Desteklenen hassasiyetin üstesinden geliyorsunuz, bunun yerine Decimal sınıfını kullanın.

>>> 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') 
İlgili konular