Pregunta Python RuntimeWarning: desbordamiento encontrado en escalares largos


Soy nuevo en la programación. En mi último proyecto de Python 2.7 encontré lo siguiente:

RuntimeWarning: overflow encontrado en long_scalars

¿Podría alguien explicar por favor qué significa esto y qué podría hacer para solucionarlo?

El código se ejecuta, pero no estoy seguro si es una buena idea ignorar la advertencia.

Sucede durante un proceso de adición como:

SomeList.append(VeryLongFormula)

32
2017-09-26 18:32


origen


Respuestas:


Aquí hay un ejemplo que emite la misma advertencia:

import numpy as np
np.seterr(all='warn')
A = np.array([10])
a=A[-1]
a**a

rendimientos

RuntimeWarning: overflow encountered in long_scalars

En el ejemplo anterior sucede porque a es de dtype int32, y el valor máximo almacenable en un int32 es 2 ** 31-1. Ya que 10**10 > 2**32-1, la exponenciación da como resultado un número que es más grande que el que puede almacenarse en un int32.

Tenga en cuenta que no puede confiar np.seterr(all='warn') atrapar todo desbordamiento errores en numpy Por ejemplo, en NumPy de 32 bits

>>> np.multiply.reduce(np.arange(21)+1)
-1195114496

mientras está en NumPy de 64 bits:

>>> np.multiply.reduce(np.arange(21)+1)
-4249290049419214848

Ambos fallan sin ninguna advertencia, aunque también se debe a un error de desbordamiento. ¡La respuesta correcta es 21! igual

In [47]: import math

In [48]: math.factorial(21)
Out[50]: 51090942171709440000L

De acuerdo con el desarrollador numpy, Robert Kern,

A diferencia de los verdaderos errores de coma flotante (donde el hardware FPU establece un   bandera   cada vez que realiza una operación atómica que se desborda), necesitamos   implementar la detección de desbordamiento entero nosotros mismos. Lo hacemos en   el       escalares, pero no arreglos porque sería demasiado lento para implementar   para       cada operación atómica en matrices.

Así que la carga está en ti para elegir lo apropiado dtypes para que ninguna operación se desborde.


39
2017-09-26 19:02



Una manera fácil de superar este problema es usar Tipo de 64 bits

list = numpy.array(list, dtype=numpy.float64)

0
2018-02-12 08:25