プログラミングは初めてです。私の最新のPython 2.7プロジェクトでは、次のことに遭遇しました。
RuntimeWarning:long_scalarsでオーバーフローが発生しました
誰かがこれが何を意味するのか、それを修正するために私ができることを詳しく説明してもらえますか?
コードは実行されますが、警告を無視するのが良い考えかどうかわかりません。
次のような追加プロセス中に発生します。
SomeList.append(VeryLongFormula)
同じ警告を発行する例を次に示します。
_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
_
真の浮動小数点エラー(ハードウェアFPUがオーバーフローするアトミック操作を行うたびにフラグを設定する)とは異なり、整数オーバーフロー検出を自分で実装する必要があります。スカラーに対して行いますが、配列に対するアトミック操作ごとに実装するには遅すぎるため、配列に対しては行いません。
そのため、適切なdtypes
を選択して、操作がオーバーフローしないようにする負担があります。
この問題を解決する簡単な方法は、64ビットタイプを使用することです
list = numpy.array(list, dtype=numpy.float64)