2013-09-30 3 views
12

x (0, ..., 1)의 값을 갖는 파이썬 math.log(x) 함수를 사용해야합니다. 때로는 X는 제로에 너무 가까이 할 수 있으며, 파이썬은 나에게 오류 제공 :math.log 함수에서 파이썬 수학 영역 오류

ValueError: math domain error

는 어떻게 알 수 math.log 기능의 정의의 도메인이 무엇입니까?

답변

11

만큼 귀하의 의견은 반 개방 구간 (0 내에있는 1]() 0을 포함하지, 당신은 잘 당신이 제로에 너무 가까이 할 수 없습니다.

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

그래서 단순히 충분, 또는 대안으로 예외를 catch하고 처리해야합니다 (아마도 언더 플로우의 결과로) 정확히 제로를 확인

편집 :.이 또한 부동 소수점 수 비정규 최소 보유 :

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

그게 내가 생각한거야.하지만'sys.float_info.min = 2.2250738585072014e-308' 동안, 내 시스템에서 여전히'math.log (2e-318)'을 할 수 있고'-731.5289 .. 답으로). 그게 뭐야? – Evert

+0

@Evert : [ "비정상적인 번호"] (http://en.wikipedia.org/wiki/Denormal_number)이며 실제로 문제의 원인이 될 수 있습니다. –

+0

아, 뭔가 배웠습니다. 나는'엡실론 (itpson) '이 관련되어있는 것으로 의심하지만, 언더 플로우 임에도 불구하고'math.log (5e-324)'에 대해 정답을 던졌습니다. 읽을 시간 [Wikipedia on this] (http://en.wikipedia.org/wiki/Double-precision_floating-point_format). – Evert

4

지원되는 정밀도를 초과하면 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')