Python ошибка math domain error

I was just testing an example from Numerical Methods in Engineering with Python.

from numpy import zeros, array
from math import sin, log
from newtonRaphson2 import *

def f(x):
    f = zeros(len(x))
    f[0] = sin(x[0]) + x[1]**2 + log(x[2]) - 7.0
    f[1] = 3.0*x[0] + 2.0**x[1] - x[2]**3 + 1.0
    f[2] = x[0] + x[1] + x[2] -5.0
    return f
    
x = array([1.0, 1.0, 1.0])
print(newtonRaphson2(f,x))

When I run it, it shows the following error:

File "example NR2method.py", line 8, in f
    f[0] = sin(x[0]) + x[1]**2 + log(x[2]) - 7.0
ValueError: math domain error

I have narrowed it down to the log as when I remove log and add a different function, it works. I assume it is because of some sort of interference with the base, I can’t figure out how. Can anyone suggest a solution?


See also: Python math domain error using math.acos function for the equivalent problem using math.acos; python math domain error — sqrt for the equivalent problem using math.sqrt.

Karl Knechtel's user avatar

Karl Knechtel

61.8k11 gold badges98 silver badges149 bronze badges

asked Apr 8, 2013 at 22:58

ramanunni.pm's user avatar

Your code is doing a log of a number that is less than or equal to zero. That’s mathematically undefined, so Python’s log function raises an exception. Here’s an example:

>>> from math import log
>>> log(-1)
Traceback (most recent call last):
  File "<pyshell#59>", line 1, in <module>
    log(-1)
ValueError: math domain error

Without knowing what your newtonRaphson2 function does, I’m not sure I can guess where the invalid x[2] value is coming from, but hopefully this will lead you on the right track.

answered Apr 8, 2013 at 23:06

Blckknght's user avatar

BlckknghtBlckknght

100k11 gold badges120 silver badges169 bronze badges

4

You may also use math.log1p.

According to the official documentation :

math.log1p(x)

Return the natural logarithm of 1+x (base e). The result
is calculated in a way which is accurate for x near zero.

You may convert back to the original value using math.expm1 which returns e raised to the power x, minus 1.

answered Feb 10, 2020 at 8:55

Catalina Chircu's user avatar

Catalina ChircuCatalina Chircu

1,5062 gold badges8 silver badges19 bronze badges

you are getting math domain error for either one of the reason :
either you are trying to use a negative number inside log function or a zero value.

answered Jun 23, 2020 at 16:37

Physics3067's user avatar

We face this problem when we use log() or sqrt() from math library. In this problem “math domain error”, we are using a negative number like (-1 or another) or a zero number where we should not be use.

answered Nov 17, 2021 at 17:48

Mohammad Al Jadallah's user avatar

You are trying to do a logarithm of something that is not positive.

Logarithms figure out the base after being given a number and the power it was raised to. 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

*Note: 0^0 can result in 0, but can also result in 1 at the same time. This problem is heavily argued over.

answered Jul 1, 2019 at 21:54

Eric Xue's user avatar

Eric XueEric Xue

2252 silver badges11 bronze badges

ValueError: math domain error [Solved Python Error]

In mathematics, there are certain operations that are considered to be mathematically undefined operations.

Some examples of these undefined operations are:

  • The square root of a negative number (√-2).
  • A divisor with a value of zero (20/0).

The «ValueError: math domain error» error in Python occurs when you carry out a math operation that falls outside the domain of the operation.

To put it simply, this error occurs in Python when you perform a math operation with mathematically undefined values.

In this article, you’ll learn how to fix the «ValueError: math domain error» error in Python.

You’ll start by learning what the keywords found in the error message mean. You’ll then see some practical code examples that raise the error and a fix for each example.

Let’s get started!

How to Fix the «ValueError: math domain error» Error in Python

A valueError is raised when a function or operation receives a parameter with an invalid value.

A domain in math is the range of all possible values a function can accept. All values that fall outside the domain are considered «undefined» by the function.

So the math domain error message simply means that you’re using a value that falls outside the accepted domain of a function.

Here are some examples:

Example #1 – Python Math Domain Error With math.sqrt

import math

print(math.sqrt(-1))
# ValueError: math domain error

In the code above, we’re making use of the sqrt method from the math module to get the square root of a number.

We’re getting the «ValueError: math domain error» returned because -1 falls outside the range of numbers whose square root can be obtained mathematically.

Solution #1 – Python Math Domain Error With math.sqrt

To fix this error, simply use an if statement to check if the number is negative before proceeding to find the square root.

If the number is greater than or equal to zero, then the code can be executed. Otherwise, a message would be printed out to notify the user that a negative number can’t be used.

Here’s a code example:

import math

number = float(input('Enter number: '))

if number >= 0:
    print(f'The square root of {number} is {math.sqrt(number)}')
else: 
    print('Cannot find the square root of a negative number')

Example #2 – Python Math Domain Error With math.log

You use the math.log method to get the logarithm of a number. Just like the sqrt method, you can’t get the log of a negative number.

Also, you can’t get the log of the number 0. So we have to modify the condition of the if statement to check for that.

Here’s an example that raises the error:

import math

print(math.log(0))
# ValueError: math domain error

Solution #2 – Python Math Domain Error With math.log

import math

number = float(input('Enter number: '))

if number > 0:
    print(f'The log of {number} is {math.log(number)}')
else: 
    print('Cannot find the log of 0 or a negative number')

In the code above, we’re using the condition of the if statement to make sure the number inputted by the user is neither zero nor a negative number (the number must be greater than zero).

Example #3 – Python Math Domain Error With math.acos

You use the math.acos method to find the arc cosine value of a number.

The domain of the acos method is from -1 to 1, so any value that falls outside that range will raise the «ValueError: math domain error» error.

Here’s an example:

import math

print(math.acos(2))
# ValueError: math domain error

Solution #3 – Python Math Domain Error With math.acos

import math

number = float(input('Enter number: '))

if -1 <= number <= 1:
    print(f'The arc cosine of {number} is {math.acos(number)}')
else:
    print('Please enter a number between -1 and 1.')

Just like the solution in other examples, we’re using an if statement to make sure the number inputted by the user doesn’t exceed a certain range.

That is, any value that falls outside the range of -1 to 1 will prompt the user to input a correct value.

Summary

In this article, we talked about the «ValueError: math domain error» error in Python.

We had a look at some code examples that raised the error, and how to check for and fix them using an if statement.

Happy coding!



Learn to code for free. freeCodeCamp’s open source curriculum has helped more than 40,000 people get jobs as developers. Get started

In Python, the ValueError: math domain error is a common error that occurs when you try to perform mathematical operations that are not defined for certain values. For example, taking the square root of a negative number, etc. In this tutorial, we will discuss the common scenarios in which this error occurs and how to fix it.

fix ValueError math domain error in Python

Understanding the error

A number of mathematical operations require certain constraints on the values that they can be applied to. For example, you can only take the square root of non-negative numbers. Taking the square root of a negative number is not a valid mathematical operation. If you perform such invalid mathematical operations in Python, you’ll end up with a ValueError: math domain error.

Here are some common scenarios in which this error occurs –

  • Trying to take the square root of a negative number
  • Trying to calculate the logarithm of a negative number
  • Trying to calculate the inverse sine or cosine of a value outside the range of -1 to 1

Let’s now look at examples of the above scenario. We’ll use the math standard library in Python to perform common math operations.

# taking the square root of a negative number
import math

x = -4
y = math.sqrt(x)
print(y)

Output:

---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

Cell In[5], line 5
      2 import math
      4 x = -4
----> 5 y = math.sqrt(x)
      6 print(y)

ValueError: math domain error

In the above example, we try to calculate the square root of the number -4, since this is not a valid math operation, we get the ValueError: math domain error.

# calculating the logarithm of a negative number
import math

x = -1
y = math.log(x)
print(y)

Output:

---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

Cell In[6], line 5
      2 import math
      4 x = -1
----> 5 y = math.log(x)
      6 print(x)

ValueError: math domain error

The logarithm operation in mathematics is only defined for positive numbers. In the above example, we’re trying to compute the logarithm of a negative number and thus we end up with a math domain error.

# calculating inverse sine or cosine of a number outside the range of -1 to 1
import math

x = 1.5
y = math.asin(x)
print(y)

Output:

---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

Cell In[7], line 4
      1 # calculating inverse sine or cosine of a number outside the range of -1 to 1
      3 x = 1.5
----> 4 y = math.asin(x)
      5 print(y)

ValueError: math domain error

Trigonometric operations such as the inverse sine or the inverse cosine can only be applied on numbers in the range -1 to 1 (both inclusive). In the above example, we use the math.asin() method to get the inverse sine of the number -1.5, since this operation is not mathematically valid we get the ValueError stating math domain error. You’ll get a similar error in performing the inverse cosine operation on values outside the range -1 to 1.

The above three are the common scenarios, you may get this error in other scenarios as well where you’re performing an invalid math operation in Python.

To fix this error, make sure that you are performing math operations on values that are valid for that operation. For example, if taking the square root, first check if the number is non-negative.

Let’s now revisit the examples from above and correct them.

# take sqauare root of only non-negative numbers
import math

x = -4
if x < 0:
    print("Invalid value")
else:
    y = math.sqrt(x)
    print(y)

Output:

Invalid value

Here, we are using an if else statement to check if the value is negative, if it is, then we do not perform the square root operation.

# take logarithm of only positive numbers
import math

import math

x = -1
if x <= 0:
    print("Invalid value")
else:
    y = math.log(x)
    print(y)

Output:

Invalid value

We only perform the logarithm operation if the value is positive.

# calculating inverse sine or cosine of a number outside the range of -1 to 1
import math

x = 1.5
if x < -1 or x > 1:
    print("Invalid value")
else:
    y = math.asin(x)
    print(y)

Output:

Invalid value

For the inverse sine or the inverse cosine operation, we first check whether the value in the range of -1 to 1 (both inclusive), if it is not, we do not perform the operation. You can see that we don’t get an error here.

Conclusion

The ValueError: math domain error occurs when you try to perform mathematical operations that are not defined for certain values. To fix this error, you can check the input values to make sure they are valid for the operation you are trying to perform, use conditional statements to handle invalid input values, alternatively you can use the try and except statements to catch the ValueError and handle it separately.

You might also be interested in –

  • How to Fix – ValueError: invalid literal for int() with base 10
  • How to Fix – ValueError not enough values to unpack
  • How to Fix – ValueError too many values to unpack
  • Piyush Raj

    Piyush is a data professional passionate about using data to understand things better and make informed decisions. He has experience working as a Data Scientist in the consulting domain and holds an engineering degree from IIT Roorkee. His hobbies include watching cricket, reading, and working on side projects.

    View all posts

In mathematics, there are operations which do not work on negative numbers or zero numbers. Consider the square root, for example. You cannot find the square root of a negative number. Python recognizes that not all operations work with negative or zero numbers.

Python will raise an error when you try to use a negative number on an operation that does not support one. In this guide, we’re going to talk about the cause of the ValueError: math domain error. Toward the end of the guide, we’ll walk through a solution to this issue.

Get offers and scholarships from top coding schools illustration

Find Your Bootcamp Match

  • Career Karma matches you with top tech bootcamps
  • Access exclusive scholarships and prep courses

Select your interest

First name

Last name

Email

Phone number

By continuing you agree to our Terms of Service and Privacy Policy, and you consent to receive offers and opportunities from Career Karma by telephone, text message, and email.

ValueError: math domain error

The Python ValueError: math domain error is raised when you use a number that is not supported by a mathematical operation. This error is commonly raised with the sqrt() method and the log() method.

The ValueError is a type of error that indicates you are performing a mathematical operation on a value that does not work with that operation. In the case of the “math domain error”, we are using a negative number or a zero number where we should not be.

Let’s walk through an example of the ValueError: math domain error issue in action.

An Example Scenario

We are building a program that calculates the square root of a given number. This program is designed to help students revise their knowledge of square roots.

Let’s write a program that calculates the square root of a given number. We will start by importing the math library that we need to calculate a square root:

Next, we’re going to collect a number from the user:

number = input("Try solving the problem first using pencil and paper. Then, insert the number whose square root you want to verify: ")

We prompt the user to try finding the answer themselves, as our program is designed to help people check their answers. Next, we’re going to find the square root of the value the user inserts:

answer = math.sqrt(int(number))

We convert the value of “number”, which stores the number whose square root the user wants to find, into an integer. This is necessary because the input() method, which we used to collect the aforementioned number, returns a string. We cannot find the square root of a string value.

Finally, let’s print the answer to the console:

print("The square root of {} is {}.".format(number, answer))

We use a format() statement to add numbers to our string. Our string will show:

"The square root of [Number user inserted] is [The square root our program calculated]"

Let’s test our program with a negative number:

Try solving the problem first using pencil and paper. Then, insert the number whose square root you want to verify: -16
Traceback (most recent call last):
  File "test.py", line 5, in <module>
	answer = math.sqrt(int(number))
ValueError: math domain error

We inserted the value -16 into our program. Our code returned an error.

Let’s fix this error.

The Solution

To fix this error, we need to prompt the user that you cannot calculate the square root of a negative number before we execute the math.sqrt() function.

Let’s revise our code to make this happen:

import math

number = input("Try solving the problem first using pencil and paper. Then, insert the number whose square root you want to verify: ")

if int(number) >= 0:
answer = math.sqrt(int(number))
print("The square root of {} is {}.".format(number, answer))
else:
	print("You cannot find the square root of a number less than 0.")

We use an if statement to check if the number the user inserts into the program is equal to or greater than zero. If the number meets this criterion, the contents of the if statement run. Otherwise, the else statement executes, presenting us with a message that we have inserted an invalid number.

Let’s run our program again. Our program returns:

Try solving the problem first using pencil and paper. Then, insert the number whose square root you want to verify: -16
You cannot find the square root of a number less than 0.

Our code works successfully.

Conclusion

The ValueError: math domain error is raised when you perform a mathematical function on a negative or zero number which cannot be computed. To solve this error, make sure you are using a valid number for the mathematical function you are using.

If you want to learn more about coding in Python, check out our How to Learn Python guide. This guide contains a number of learning resources, courses, and books designed for people who are learning the Python programming language.

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.


Table of contents

  • ValueError: math domain error
    • What is a ValueError?
  • Example #1: Square Root of a Negative Number
    • Solution #1: Use an if statement
    • Solution #2: Use cmath
  • Example #2: Logarithm of Zero
    • Solution
  • Summary

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!

  • Pyinstaller ошибка при компиляции
  • Python вызов ошибки raise
  • Python ошибка invalid literal for int with base 10
  • Pyinstaller ошибка после компиляции
  • Python выдает ошибку синтаксиса