web-dev-qa-db-ja.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がdtype _int32_であり、_int32_に格納可能な最大値が2 ** 31-1であるために発生します。 _10**10 > 2**32-1_であるため、べき乗の結果、_int32_に格納できる数よりも大きな数になります。

Numpyのすべてのオーバーフローエラーをキャッチするためにnp.seterr(all='warn')に依存できないことに注意してください。たとえば、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開発者、Robert Kernによる

真の浮動小数点エラー(ハードウェアFPUがオーバーフローするアトミック操作を行うたびにフラグを設定する)とは異なり、整数オーバーフロー検出を自分で実装する必要があります。スカラーに対して行いますが、配列に対するアトミック操作ごとに実装するには遅すぎるため、配列に対しては行いません。

そのため、適切なdtypesを選択して、操作がオーバーフローしないようにする負担があります。

50
unutbu

この問題を解決する簡単な方法は、64ビットタイプを使用することです

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