I have to use Python math.log[x]
function with values of x from [0, ..., 1]. Sometimes x may be too close to zero, and Python gives me an error:
ValueError: math domain error
How can I know, what is the domain of definition of math.log
function?
asked Sep 30, 2013 at 13:41
1
As long as your input is within the half-open interval [0, 1] [not including 0], you are fine. You can't be too close to zero:
>>> math.log[sys.float_info.min]
-708.3964185322641
So simply checking for exactly zero [maybe as the result of an underflow] should be enough, or alternatively catch the exception and handle it.
EDIT: This also holds for the denormal minimum floating point number:
>>> math.log[sys.float_info.min * sys.float_info.epsilon]
-744.4400719213812
answered Sep 30, 2013 at 13:51
Sven MarnachSven Marnach
543k114 gold badges914 silver badges816 bronze badges
3
You are going over the supported precision, use Decimal class instead.
>>> from math import log
>>> from decimal import Decimal
>>> d = Decimal['1E-1024']
>>> log[d]
Traceback [most recent call last]:
File "", line 1, in
ValueError: math domain error
>>> d.ln[]
Decimal['-2357.847135225902780434423250']
answered Sep 30, 2013 at 13:50
ismailismail
44.3k8 gold badges84 silver badges95 bronze badges
You come across a special ValueError when working with Python’s math module. It is ValueError: math domain error. Python raises this error when you try to do something that is not mathematically possible or mathematically defined.
To solve a domain error in Python, passing a valid input for which the function can calculate a numerical output. The math domain error occurs when you’ve passed an undefined input into the math function. For example, you are doing a log of a number less than or equal to zero. That’s mathematically undefined, so Python’s log function raises an exception.
from math import log print[log[-1]]
Output
Traceback [most recent call last]: File "/Users/krunal/Desktop/code/pyt/database/app.py", line 3, in print[log[-1]] ValueError: math domain error
And we get the ValueError: math domain error.
Whenever you are getting the math domain error for either reason, you are trying to use a negative number inside the log function or a zero value.
Logarithms decide the base after being given a number and the power it was raised to.
The log[0] means that something raised to the power of 2 is 0. An exponent can never result in 0*, which means that log[0] has no answer, thus throwing the math domain error.
The domain of a function is the set of all possible input values. If Python throws the ValueError: math domain error, you’ve passed an undefined input into the math function.
In our case, don’t calculate the log of a negative number or zero, and it will resolve the error.
There are various scenarios in which this error can occur. Let’s see some of them one by one.
Python sqrt: Math domain error
To calculate the square root of a number in Python, use math.sqrt[] method.
The math domain error appears if you pass a negative argument into the math.sqrt[] function.
It’s mathematically impossible to calculate the square root of a negative number without using complex numbers.
from math import sqrt print[sqrt[-1]]
Output
Traceback [most recent call last]: File "/Users/krunal/Desktop/code/pyt/database/app.py", line 3, in print[sqrt[-1]] ValueError: math domain error
The square root of a negative number is not mathematically possible. That’s why it throws an error.
Python pow: Math domain error
The math domain error for the math.pow[a,b] function to calculate a**b arises if you pass the negative base value into it and try to calculate a negative power.
from math import pow print[pow[-1, 0.5]]
Output
Traceback [most recent call last]: File "/Users/krunal/Desktop/code/pyt/database/app.py", line 3, in print[pow[-1, 0.5]] ValueError: math domain error
And we get the ValueError.
That is it for this tutorial.
See also
String Indices must be Integers in Python
Python expected an indented block Error
Python cannot import name
Return outside function Python
Python ValueError