You may encounter a special ValueError
when working with Python’s math
module.
ValueError: math domain error
Python raises this error when you try to do something that is not mathematically possible or mathematically defined.
To understand this error, have a look at the definition of the domain:
“The domain of a function is the complete set of possible values of the independent variable. Roughly speaking, the domain is the set of all possible (input) x-values which result in a valid (output) y-value.” (source)
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. Fix the error by passing a valid input for which the function is able to calculate a numerical output.
Here are a few examples:
Python Math Domain Error Sqrt
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. Python doesn’t get that and throws a ValueError: math domain error
.
Here’s a minimal example:
from math import sqrt print(sqrt(-1)) ''' Traceback (most recent call last): File "C:\Users\xcent\Desktop\Finxter\Blog\code.py", line 2, in <module> print(sqrt(-1)) ValueError: math domain error '''
You can fix the math domain error by using the cmath
package that allows the creation of complex numbers:
from cmath import sqrt print(sqrt(-1)) # 1j
Python Math Domain Error Log
The math domain error
for the math.log()
function appears if you pass a zero value into it—the logarithm is not defined for value 0.
Here’s the code on an input value outside the domain of the logarithm function:
from math import log print(log(0))
The output is the math domain error:
Traceback (most recent call last): File "C:\Users\xcent\Desktop\Finxter\Blog\code.py", line 3, in <module> print(log(0)) ValueError: math domain error
You can fix this error by passing a valid input value into the math.log()
function:
from math import log print(log(0.000001)) # -13.815510557964274
This error can sometimes appear if you pass a very small number into it—Python’s float type cannot express all numbers. To pass a value “close to 0”, use the Decimal
module with higher precision, or pass a very small input argument such as:
math.log(sys.float_info.min)
Python Math Domain Error Acos
The math domain error
for the math.acos()
function appears if you pass a value into it for which it is not defined—arccos is only defined for values between -1 and 1.
Here’s the wrong code:
import math print(math.acos(2))
The output is the math domain error:
Traceback (most recent call last): File "C:\Users\xcent\Desktop\Finxter\Blog\code.py", line 3, in <module> print(math.acos(2)) ValueError: math domain error
You can fix this error by passing a valid input value between [-1,1] into the math.acos()
function:
import math print(math.acos(0.5)) # 1.0471975511965979
Python Math Domain Error Asin
The math domain error
for the math.asin()
function appears if you pass a value into it for which it is not defined—arcsin is only defined for values between -1 and 1.
Here’s the erroneous code:
import math print(math.asin(2))
The output is the math domain error:
Traceback (most recent call last): File "C:\Users\xcent\Desktop\Finxter\Blog\code.py", line 3, in <module> print(math.asin(2)) ValueError: math domain error
You can fix this error by passing a valid input value between [-1,1] into the math.asin()
function:
import math print(math.asin(0.5)) # 0.5235987755982989
Python Math Domain Error Pow
The math domain error
for the math.pow(a,b)
function to calculate a**b appears if you pass a negative base value into it and try to calculate a negative power of it. The reason it is not defined is that any negative number to the power of 0.5 would be the square number—and thus, a complex number. But complex numbers are not defined by default in Python!
import math print(math.pow(-2, 0.5))
The output is the math domain error:
Traceback (most recent call last): File "C:\Users\xcent\Desktop\Finxter\Blog\code.py", line 3, in <module> print(math.pow(-2, 0.5)) ValueError: math domain error
If you need a complex number, ab must be rewritten into eb ln a. For example:
import cmath print(cmath.exp(0.5 * cmath.log(-2))) # (8.659560562354932e-17+1.414213562373095j)
You see, it’s a complex number!
NumPy Math Domain Error — np.log(x)
import numpy as np import matplotlib.pyplot as plt # Plotting y = log(x) fig, ax = plt.subplots() ax.set(xlim=(-5, 20), ylim=(-4, 4), title='log(x)', ylabel='y', xlabel='x') x = np.linspace(-10, 20, num=1000) y = np.log(x) plt.plot(x, y)
This is the graph of log(x)
. Don’t worry if you don’t understand the code, what’s more important is the following point. You can see that log(x) tends to negative infinity as x tends to 0. Thus, it is mathematically meaningless to calculate the log of a negative number. If you try to do so, Python raises a math domain error.
>>> math.log(-10) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: math domain error
Where to Go From Here?
Enough theory. Let’s get some practice!
Coders get paid six figures and more because they can solve problems more effectively using machine intelligence and automation.
To become more successful in coding, solve more real problems for real people. That’s how you polish the skills you really need in practice. After all, what’s the use of learning theory that nobody ever needs?
You build high-value coding skills by working on practical coding projects!
Do you want to stop learning with toy projects and focus on practical code projects that earn you money and solve real problems for people?
🚀 If your answer is YES!, consider becoming a Python freelance developer! It’s the best way of approaching the task of improving your Python skills—even if you are a complete beginner.
If you just want to learn about the freelancing opportunity, feel free to watch my free webinar “How to Build Your High-Income Skill Python” and learn how I grew my coding business online and how you can, too—from the comfort of your own home.