The error message:
ValueError: math domain error
occurs when you pass an invalid argument to a mathematical function in the math
module. This typically happens when using functions that have specific input restrictions, such as sqrt()
, log()
, acos()
, etc.
1. Causes and Solutions
Cause 1: Taking the Square Root of a Negative Number
The math.sqrt()
function only works with non-negative numbers. Trying to compute the square root of a negative number results in this error.
Incorrect Code:
import math
print(math.sqrt(-4)) # ValueError: math domain error
Solution: Use Complex Numbers (cmath
) for Negative Roots
import cmath
print(cmath.sqrt(-4)) # Output: 2j
Cause 2: Taking the Logarithm of Zero or a Negative Number
The logarithm (log()
) is only defined for positive numbers.
Incorrect Code:
import math
print(math.log(0)) # ValueError
print(math.log(-5)) # ValueError
Solution: Ensure Input is Positive
num = 0
if num > 0:
print(math.log(num))
else:
print("Invalid input for logarithm") # Handle the error
Cause 3: Using Inverse Trigonometric Functions with Out-of-Range Values
Functions like math.acos()
, math.asin()
, and math.atanh()
only accept values within specific ranges.
Incorrect Code:
import math
print(math.acos(2)) # ValueError
print(math.asin(-2)) # ValueError
print(math.atanh(2)) # ValueError
Solution: Ensure Values are Within the Valid Range
asin()
andacos()
expect values between -1 and 1.atanh()
expects values between -1 and 1 (exclusive).
x = 2
if -1 <= x <= 1:
print(math.acos(x))
else:
print("Invalid input for acos()")
Cause 4: Taking the Factorial of a Negative Number or Non-Integer
The math.factorial()
function only works with non-negative integers.
Incorrect Code:
import math
print(math.factorial(-5)) # ValueError
print(math.factorial(4.5)) # ValueError
Solution: Ensure Input is a Non-Negative Integer
num = -5
if num >= 0 and isinstance(num, int):
print(math.factorial(num))
else:
print("Invalid input for factorial") # Handle the error