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
имеет тип int32
и максимальное значение, хранимое в int32
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
По словам наглого разработчика Роберта Керна,
В отличие от истинных ошибок с плавающей запятой (когда аппаратный FPU устанавливает флаг всякий раз, когда он выполняет атомарную операцию, которая переполняется), нам нужно реализовать обнаружение целочисленного переполнения самостоятельно. Мы делаем это в скалярах, но не в массивах, потому что это будет слишком медленно реализовывать для каждой элементарной операции над массивами.
Так что бремя на вас, чтобы выбрать подходящий dtypes
так что ни одна операция не переполняется.
Простой способ преодолеть эту проблему - использовать 64-битный тип
list = numpy.array(list, dtype=numpy.float64)