我必须使用来自(0,...,1)的值为 x 的Python math.log(x)
函数。有时x可能太接近于零,Python给了我一个错误:
ValueError:数学域错误
我怎么知道math.log
函数定义的域名是什么?
答案 0 :(得分:15)
只要您的输入在半开区间(0,1)(不包括0)内,您就可以了。您不能太接近零:
>>> math.log(sys.float_info.min)
-708.3964185322641
所以简单地检查确切为零(可能是下溢的结果)应该足够了,或者可以捕获异常并处理它。
编辑:这也适用于非正规最小浮点数:
>>> math.log(sys.float_info.min * sys.float_info.epsilon)
-744.4400719213812
答案 1 :(得分: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')