Desbordamiento encontrado en la función numpy.exp() en Python

Vaibhav Vaibhav 30 marzo 2022
Desbordamiento encontrado en la función numpy.exp() en Python

El NumPy es un paquete de Python que es rico en utilidades para jugar con grandes matrices y arreglos multidimensionales y realizar operaciones matemáticas tanto complejas como sencillas sobre ellos.

Estas utilidades son dinámicas para las entradas y altamente optimizadas y rápidas. El paquete NumPy tiene una función exp() que calcula el exponencial de todos los elementos de un array numpy de entrada.

En otras palabras, calcula ex, x es cada número del array numpy de entrada, y e es el número de Euler que es aproximadamente igual a 2.71828.

Dado que este cálculo puede dar como resultado un número enorme, algunos tipos de datos no pueden manejar valores tan grandes y, por lo tanto, esta función devolverá inf y un error en lugar de un valor flotante válido.

Por ejemplo, esta función devolverá 8.21840746e+307 para numpy.exp(709) pero runtimeWarning: overflow found in exp inf para numpy.exp(710).

En este artículo, aprenderemos cómo solucionar este problema.

Corrección de desbordamiento en la función numpy.exp() en Python NumPy

Tenemos que almacenar valores en un tipo de datos capaz de contener valores tan grandes para solucionar este problema.

Por ejemplo, np.float128 puede contener números mucho más grandes que float64 y float32. Todo lo que tenemos que hacer es encasillar cada valor de un array a un tipo de datos más grande y almacenarlo en un array numpy.

El siguiente código de Python muestra esto.

import numpy as np

a = np.array([1223, 2563, 3266, 709, 710], dtype=np.float128)
print(np.exp(a))

Producción :

[1.38723925e+0531 1.24956001e+1113 2.54552810e+1418 8.21840746e+0307
 2.23399477e+0308]

Aunque el código de Python anterior se ejecuta a la perfección sin ningún problema, aún así, somos propensos al mismo error.

La razón detrás de esto es bastante simple; incluso np.float128 tiene un valor de umbral para los números que puede contener. Cada tipo de datos tiene un límite superior, y si se cruza ese límite superior, las cosas comienzan a tener errores y los programas comienzan a ejecutar errores de desbordamiento.

Para comprender el punto mencionado anteriormente, consulte el siguiente código de Python. Aunque np.float128 resolvió nuestro problema en el último fragmento de código de Python, no funcionaría para valores aún mayores.

import numpy as np

a = np.array([1223324, 25636563, 32342266, 235350239, 27516346320], dtype=np.float128)
print(np.exp(a))

Producción :

<string>:4: RuntimeWarning: overflow encountered in exp
[inf inf inf inf inf]

La función exp() devuelve un infinito para cada valor en la matriz numpy.

Para conocer la función numpy.exp(), consulte la documentación oficial de NumPy aquí.

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.