Kodeclik Blog
Math Domain Error in Python
When you write programs in Python involving numerical operations you might encounter a “ValueError: math domain error” message. Let us see when it occurs and how to fix it.
Recall that the input to a function is called the “domain” and the output of the function is referred to as the “range”. Thus the math domain error is one where the input to the function is incorrect. Below are common scenarios where this happens.
Taking the square root of a negative number
Consider the following Python program.
import math
print(math.sqrt(-3))
The output will be:
Traceback (most recent call last):
File "main.py", line 3, in <module>
print(math.sqrt(-3))
ValueError: math domain error
We get the dreaded “ValueError: math domain error”. From this message we can conclude that the input to the sqrt function in the math module is incorrect. Here, the problem is that we have input a negative integer to the sqrt() function. If we update it to a positive (or zero) integer, the error will go away.
When this error occurs, it is usually because you have forgotten to consider all possible inputs to a mathematical function. To avoid this type of error, it is important to think about every possible input to a mathematical function before writing code to execute that function. In this manner you can trap the situations where this error can arise in your program.
Note that to obtain the “ValueError: math domain error” it is not sufficient to simply make a “math related” mistake. You must use a function and supply it the wrong kind of input (from what it is expecting). For instance, just trying to divide by zero, like so:
import math
print(6/0)
This will yield:
Traceback (most recent call last):
File "main.py", line 3, in <module>
print(6/0)
ZeroDivisionError: division by zero
i.e., not quite the math domain error.
Taking the logarithm of a negative number
Similar to the previous example you will get the same math domain error if you attempt to take the logarithm of a negative number like so:
import math
print(math.log(-6))
The output is:
Traceback (most recent call last):
File "main.py", line 3, in <module>
print(math.log(-6))
ValueError: math domain error
because the logarithm of negative numbers is not defined. You will get the same error if you attempt to take the logarithm of zero:
import math
print(math.log(0))
The output is again:
Traceback (most recent call last):
File "main.py", line 3, in <module>
print(math.log(0))
ValueError: math domain error
The Math domain error in Python Math.pow()
Similar to the sqrt() example above, we will get the same error if we use the Python Math.pow() function and attempt to take the square root of a negative number by raising it to the power of “0.5”:
import math
print(math.pow(-1,0.5))
The output is:
Traceback (most recent call last):
File "main.py", line 3, in <module>
print(math.pow(-1,0.5))
ValueError: math domain error
Fixing the Math domain error
Fixing the Math domain error is quite simple. When you get this error look above the error message to see the exact line where it is happening. Inspect that math function to understand how the input to that function falls outside the normal domain of applicability.
To learn about more Python math capabilities, learn about the Python math.sin() function!
Interested in more things Python? Checkout our post on Python queues. Also see our blogpost on Python's enumerate() capability. Also if you like Python+math content, see our blogpost on Magic Squares. Finally, master the Python print function!
Want to learn Python with us? Sign up for 1:1 or small group classes.