Python中math.log函数出现域错误

28

我需要使用Python中的math.log(x)函数,其中x的取值范围为(0, ..., 1)。有时候,x可能非常接近于零,这会导致Python出现错误:

ValueError: math domain error

我该如何知道math.log函数的定义域是什么?


4
为什么错误提示信息里不直接告诉我们它无法计算log(0)呢? - gseattle
2个回答

27
只要你的输入在半开区间 (0, 1] (不包括 0)内,就可以了。但是你不能太靠近零:
>>> 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... 作为答案)。这是怎么回事? - user707650
@Evert:那是一个“非规格化数”(dnormal number),它们实际上可能是你问题的原因。 - Sven Marnach
啊,学到了新东西。我怀疑epsilon有关,但我仍然惊讶于它实际上为math.log(5e-324)抛出了正确的答案,尽管这是一种下溢情况。是时候阅读维基百科上的相关内容了。 - user707650

7
您超出了支持的精度范围,请使用 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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接