Python RuntimeWarning: переполнение, встречающееся в длинных скалярах
Я новичок в программировании. В моем последнем проекте Python 2.7 я столкнулся со следующим:
RuntimeWarning: переполнение встречается в long_scalars
может кто-нибудь уточнить, что это значит и что я могу сделать, чтобы исправить это?
код проходит, но я не уверен, что это хорошая идея, чтобы просто игнорировать предупреждение.
это происходит во время добавления как:
SomeList.append(VeryLongFormula)
2 ответов
вот пример, который выдает то же предупреждение:
import numpy as np
np.seterr(all='warn')
A = np.array([10])
a=A[-1]
a**a
доходность
RuntimeWarning: overflow encountered in long_scalars
в приведенном выше примере это происходит потому, что a
имеет dtype int32
, и максимальное значение storable в int32
is 2 * * 31-1. С 10**10 > 2**32-1
, экспоненциальность приводит к числу, которое больше, чем то, которое может быть сохранено в int32
.
обратите внимание, что вы не можете положиться на np.seterr(all='warn')
поймать все переполнение
ошибки в пакете numpy. Например, на 32-разрядной И NumPy
>>> np.multiply.reduce(np.arange(21)+1)
-1195114496
в то время как на 64-битном NumPy:
>>> np.multiply.reduce(np.arange(21)+1)
-4249290049419214848
оба сбоя без предупреждения, хотя это также связано с ошибкой переполнения. Правильный ответ-21! равно
In [47]: import math
In [48]: math.factorial(21)
Out[50]: 51090942171709440000L
согласно разработчику numpy, Роберт Керн,
В отличие от истинных ошибок с плавающей запятой (где аппаратный FPU устанавливает флаг всякий раз, когда он делает атомарную операцию, которая переполняется), нам нужно реализовать переполнение integer сами себя обнаруживаем. Мы делаем это! этот скаляры, но не массивы, потому что это было бы слишком медленно реализовать для каждая атомная операция на массивах.
таким образом, бремя на вас, чтобы выбрать подходящий dtypes
так, что никакая операция не переполняется.
простой способ преодолеть эту проблему-использовать 64 битного типа
list = numpy.array(list, dtype=numpy.float64)