Подтвердить что ты не робот

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

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

RuntimeWarning: переполнение, встречающееся в long_scalars

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

Код проходит, но я не уверен, что это хорошая идея просто игнорировать предупреждение.

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

SomeList.append(VeryLongFormula)
4b9b3361

Ответ 1

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

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, чтобы никакая операция не переполнялась.

Ответ 2

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

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