it-roy-ru.com

Python RuntimeWarning: переполнение, встречающееся в длинных скалярах

Я новичок в программировании. В моем последнем проекте Python 2.7) я обнаружил следующее:

RuntimeWarning: переполнение, обнаруженное в long_scalars

Может кто-нибудь объяснить, что это значит и что я могу сделать, чтобы это исправить?

Код запускается, но я не уверен, стоит ли игнорировать предупреждение.

Это происходит во время процесса добавления, например:

SomeList.append(VeryLongFormula)
46
timkado

Вот пример, который выдает то же самое предупреждение:

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

доходность

_RuntimeWarning: overflow encountered in long_scalars
_

В приведенном выше примере это происходит потому, что a имеет тип d__ _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, чтобы никакие операции не были переполнены.

50
unutbu

Простой способ преодолеть эту проблему - использовать 64-битный тип

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