math.log函数中的python数学域错误

math.log函数中的python数学域错误,python,math,Python,Math,我必须使用Pythonmath.log(x)函数,其值为xfrom(0,…,1)。有时x可能太接近于零,Python给了我一个错误: ValueError:数学域错误 我怎么知道,math.log函数的定义域是什么?如果要检查支持的精度,请使用类 >>> from math import log >>> from decimal import Decimal >>> d = Decimal('1E-1024') >>> l

我必须使用Python
math.log(x)
函数,其值为xfrom(0,…,1)。有时x可能太接近于零,Python给了我一个错误:

ValueError:数学域错误


我怎么知道,
math.log
函数的定义域是什么?

如果要检查支持的精度,请使用类

>>> 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')
数学导入日志中的
>>
>>>从十进制输入十进制
>>>d=十进制('1E-1024')
>>>日志(d)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:数学域错误
>>>d.ln()
十进制('-2357.847135225902780434423250')

只要您的输入在半开区间(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\u info.min=2.2250738585072014e-308
,我仍然可以在我的系统上做
math.log(2e-318)
(并得到
-731.5289…
).这是怎么回事?@Evert:这是一个问题,它们实际上可能是你问题的原因。啊,学到了一些东西。我怀疑
epsilon
与此有关,但我仍然很惊讶它居然为
math.log(5e-324)给出了正确的答案
,即使这是一个下溢。该阅读了。不知道他们为什么不在错误消息中告诉我们它不能做日志(0)