Runtimewarning: invalid value encountered in double_scalars

Hello Python enthusiasts, in today’s blog, we’ll go through a common warning message that surfaces during any floating-point operation. Our keyword for this session is RuntimeWarning: invalid value encountered in double_scalars.

This error usually occurs when you try to perform any operation, say a division, where the denominator turns out to be zero.

Overview of “RuntimeWarning: invalid value encountered in double_scalars”

When you’re handling floating point numbers in Python and numpy, you may encounter the RuntimeWarning: invalid value encountered in double_scalars.

This error happens when the numpy or scipy libraries try to perform an operation that returns an invalid value, such as dividing by zero, reaching the maximum limit, or finding the logarithm of a negative number among others.

What causes the “RuntimeWarning: invalid value encountered in double_scalars” error?

The primary cause for this warning is when you are trying to execute division operation where the denominator ends up as zero. Python and its libraries, including numpy, generate this warning when they come across these types of calculations.

One such problematic calculation might look like this:

answer1 = np.exp(-3 * np.array([1089, 1093]))
answer2 = np.exp(-3 * np.array([1000, 4443]))
result = answer1.sum() / answer2.sum()

In the above code, answer1 is the exponent of 2 very large, negative numbers, so the result gets rounded to zero. Consequently, the division operation in the result line attempts to divide some number by this zero value.

How to resolve the “RuntimeWarning: invalid value encountered in double_scalars” error?

Solution 1

The most straightforward way to tackle this issue is by doing some math manipulation. When the numerator (top part of a fraction) has very large numbers, we can perform a logarithm operation to simplify the calculation. Here is an example code that solves the problem:

x=3* 1089 
y=3* 1093 
z=3* 1000 

result = np.exp(-x + np.log(1+np.exp(-y+x))) / np.exp(-z)
print(result)

Solution 2

Another way to solve the problem is by using numpy’s built-in methods. np.logaddexp takes the logarithm of the sum of exponentials of input elements and can perform the operation without the risk of overflow:

import numpy as np
d = np.array([[1089, 1093]])
e = np.array([[1000, 4443]])

log_res = np.logaddexp(-3*d[0,0], -3*d[0,1]) - np.logaddexp(-3*e[0,0], -3*e[0,1])
res = np.exp(log_res)
print(res)

Solution 3

Another common cause of this warning is division by zero, as I found out in one of my projects. Be sure to check for this when encountering the warning.

Solution 4

Floating-point calculation errors can be dealt with using numpy.seterr function. It allows you to set how floating-point errors are handled and can be used to get more insights about the error.

FAQs

Can I ignore RuntimeWarning: invalid value encountered in double_scalars?

It’s not advisable to ignore this warning. Although it does not stall or stop the execution of your program, it is indicative of some issues in your code that might lead to incorrect, unexpected results.

What are the common operations that can lead to this warning?

Division by zero is the most common operation that can lead to this warning. However, exceeding the maximum limit of floating-point numbers or trying to take a logarithm of a negative number can also cause this error.

Conclusion

Python is an amazing language with numerous amazing libraries at its disposal, yet it still has its quirks. Python’s numerical computing library, numpy, often generates a RuntimeWarning: invalid value encountered in double_scalars when it attempts to take the logarithm of a negative number, divide by zero, or reach the maximum limit.

In this article, we looked at how to resolve this but just remember, the best solution is avoiding these arithmetic errors from happening in the first place. Happy coding!

References

  1. Numpy exp

Follow us at PythonClear to learn more about modules and solutions to general errors one may encounter while programming in Python.

Leave a Comment