Ошибки домена math.log в python

Мне нужно использовать функцию Python math.log(x) со значениями x из (0,..., 1). Иногда x может быть слишком близко к нулю, а Python дает мне ошибку:

ЗначениеError: ошибка в области математики

Как я могу узнать, что является областью определения функции math.log?

Ответ 1

Пока ваш вход находится в пределах полуоткрытого интервала (0, 1] (не включая 0), вы в порядке. Вы не можете быть слишком близки к нулю:

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

Так что просто проверить ровно нуль (возможно, в результате переполнения) должно быть достаточно или, альтернативно, поймать исключение и обработать его.

EDIT. Это также относится к денормальному минимуму числа с плавающей запятой:

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

Ответ 2

Вы переходите на поддерживаемую точность, вместо этого используйте 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')