Select Page

How to Solve Python ValueError: math domain error

by | Programming, Python, Tips

The domain of a mathematical function is the set of all possible input values. If you pass an undefined input to a function from the math library, you will raise the ValueError: math domain error.

To solve this error, ensure that you use a valid input for the mathematical function you wish to use. You can put a conditional statement in your code to check if the number is valid for the function before performing the calculation.

You cannot use functions from the math library with complex numbers, such as calculating a negative number’s square root. To do such calculations, use the cmath library.

This tutorial will go through the error in detail and solve it with the help of some code examples.


ValueError: math domain error

What is a ValueError?

In Python, a value is the information stored within a particular object. You will encounter a ValueError in Python when you use a built-in operation or function that receives an argument with the right type but an inappropriate value.

The ValueError: math domain error occurs when you attempt to use a mathematical function with an invalid value. You will commonly see this error using the math.sqrt() and math.log() methods.

Example #1: Square Root of a Negative Number

Let’s look at an example of a program that calculates the square root of a number.

import math

number = int(input("Enter a number: "))

sqrt_number = math.sqrt(number)

print(f' The square root of {number} is {sqrt_number}')

We import the math library to use the square root function in the above code. We collect the number from the user using the input() function. Next, we find the square root of the number and print the result to the console using an f-string. Let’s run the code to see the result:

Enter a number: -4
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
      3 number = int(input("Enter a number: "))
      4 
----> 5 sqrt_number = math.sqrt(number)
      6 
      7 print(f' The square root of {number} is {sqrt_number}')

ValueError: math domain error

We raise the ValueError because a negative number does not have a real square root.

Solution #1: Use an if statement

To solve this error, we can check the value of the number before attempting to calculate the square root by using an if statement. Let’s look at the revised code:

import math

number = int(input("Enter a number: "))

if number > 0:

    sqrt_number = math.sqrt(number)

    print(f' The square root of {number} is {sqrt_number}')

else:

    print('The number you input is less than zero. You cannot find the real square root of a negative number.')

In the above code, we check if the user’s number is greater than zero. If it is, we calculate the number’s square root and print it to the console. Otherwise, we print a statement telling the user the number is invalid for the square root function. Let’s run the code to see the result:

Enter a number: -4
The number you input is less than zero. You cannot find the real square root of a negative number.

Go to the article: Python Square Root Function for further reading on calculating the square root of a number in Python.

Solution #2: Use cmath

We can also solve the square root math domain error using the cmath library. This library provides access to mathematical functions for complex numbers. The square root of a negative number is a complex number with a real and an imaginary component. We will not raise a math domain error using the square root function from cmath on a negative number. Let’s look at the revised code:

import cmath

number = int(input("Enter a number: "))

sqrt_number = cmath.sqrt(number)

print(f' The square root of {number} is {sqrt_number}')

Let’s run the code to get the result:

Enter a number: -4

The square root of -4 is 2j

Example #2: Logarithm of Zero

Let’s look at an example of a program that calculates the natural logarithm of a number. The log() method returns the natural logarithm of a number or to a specified base. The syntax of the math.log() method is:

math.log(x, base)

Parameters:

  • x: Required. The value to calculate the number logarithm for.
  • base: Optional. The logarithmic base to use. The default is e.
import math

number = int(input("Enter a number: "))

print(f'The log of {number} is {math.log(number)}.')

We import the math library to use the natural logarithm function in the above code. We collect the number from the user using the input() function. Next, we find the natural logarithm of the number and print the result to the console using an f-string. Let’s run the code to see the result:

Enter a number: 0

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
      3 number = int(input("Enter a number: "))
      4 
----> 5 print(f'The log of {number} is {math.log(number)}.')

ValueError: math domain error

We raise the ValueError because you cannot calculate the natural logarithm of 0 or a negative number. The log(0) means that the exponent e raised to the power of a number is 0. An exponent can never result in 0, which means log(0) has no answer, resulting in the math domain error.

Solution

We can put an if statement in the code to check if the number we want to use is positive to solve this error. Let’s look at the revised code:

import math

number = int(input("Enter a number: "))

if number > 0:

    print(f'The log of {number} is {math.log(number)}.')

else:

    print(f'The number you provided is less than or equal to zero. You can only get the logarithm of positive real numbers')

Now we will only calculate the natural logarithm of the number if it is greater than zero. Let’s run the code to get the result:

Enter a number: 0

The number you provided is less than or equal to zero. You can only get the logarithm of positive real numbers

Summary

Congratulations on reading to the end of this tutorial! ValueError: math domain error occurs when you attempt to perform a mathematical function with an invalid number. Every mathematical function has a valid domain of input values you can choose. For example, the logarithmic function accepts all positive, real numbers. To solve this error, ensure you use input from the domain of a function. You can look up the function in the math library documentation to find what values are valid and which values will raise a ValueError.

Go to the online courses page on Python to learn more about coding in Python for data science and machine learning.

Have fun and happy researching!

Research Scientist at Moogsoft | + posts

Suf is a research scientist at Moogsoft, specializing in Natural Language Processing and Complex Networks. Previously he was a Postdoctoral Research Fellow in Data Science working on adaptations of cutting-edge physics analysis techniques to data-intensive problems in industry. In another life, he was an experimental particle physicist working on the ATLAS Experiment of the Large Hadron Collider. His passion is to share his experience as an academic moving into industry while continuing to pursue research. Find out more about the creator of the Research Scientist Pod here and sign up to the mailing list here!