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)
Другие вопросы по тегам