Python RuntimeWarning: переполнение, встречающееся в длинных скалярах - PullRequest
43 голосов
/ 26 сентября 2011

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

RuntimeWarning: переполнение в long_scalars

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

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

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

SomeList.append(VeryLongFormula)

Ответы [ 2 ]

49 голосов
/ 26 сентября 2011

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

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, иМаксимальное значение, хранимое в 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

По словам разработчика numpy Роберта Керна ,

В отличие от истинных ошибок с плавающей запятой (когда аппаратный FPU устанавливает флаг всякий раз, когда он выполняетатомарная операция, которая переполняется), мы должны сами реализовать целочисленное определение переполненияМы делаем это в скалярах, но не в массивах, потому что это будет слишком медленно реализовывать для каждой элементарной операции над массивами.

Так что вы должны выбрать подходящий dtypes, чтобы не выполнять никаких операцийпереполнение.

7 голосов
/ 12 февраля 2018

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

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