我需要使用Python中的math.log(x)
函数,其中x的取值范围为(0, ..., 1)。有时候,x可能非常接近于零,这会导致Python出现错误:
ValueError: math domain error
我该如何知道math.log
函数的定义域是什么?
>>> math.log(sys.float_info.min)
-708.3964185322641
所以仅仅检查是否恰好为零(可能是下溢的结果)就足够了,或者捕获异常并处理它都可以。编辑:这也适用于浮点数的非规格化最小值。>>> math.log(sys.float_info.min * sys.float_info.epsilon)
-744.4400719213812
sys.float_info.min=2.2250738585072014e-308
,在我的系统上我仍然可以执行 math.log(2e-318)
(并得到 -731.5289...
作为答案)。这是怎么回事? - user707650epsilon
有关,但我仍然惊讶于它实际上为math.log(5e-324)
抛出了正确的答案,尽管这是一种下溢情况。是时候阅读维基百科上的相关内容了。 - user707650>>> 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')