web-dev-qa-db-de.com

Python RuntimeWarning: Überlauf in langen Skalaren

Ich bin neu in der Programmierung. In meinem neuesten Python 2.7-Projekt bin ich auf Folgendes gestoßen:

RuntimeWarning: In long_scalars ist ein Überlauf aufgetreten

Könnte jemand bitte erläutern, was dies bedeutet und was ich tun könnte, um das zu beheben?

Der Code läuft durch, aber ich bin mir nicht sicher, ob es eine gute Idee ist, die Warnung einfach zu ignorieren.

Es passiert während eines Append-Prozesses wie:

SomeList.append(VeryLongFormula)
46
timkado

Hier ist ein Beispiel, das dieselbe Warnung ausgibt:

import numpy as np
np.seterr(all='warn')
A = np.array([10])
a=A[-1]
a**a

ausbeuten

RuntimeWarning: overflow encountered in long_scalars

Im obigen Beispiel geschieht dies, weil a vom Typ d int32 Ist und der in einem int32 Speicherbare Maximalwert 2 ** 31-1 beträgt. Seit 10**10 > 2**32-1 Ergibt die Potenzierung eine Zahl, die größer ist als die, die in einem int32 Gespeichert werden kann.

Beachten Sie, dass Sie sich nicht auf np.seterr(all='warn') verlassen können, um alle Überlauffehler in numpy abzufangen. Zum Beispiel auf 32-Bit-NumPy

>>> np.multiply.reduce(np.arange(21)+1)
-1195114496

während auf 64-Bit-NumPy:

>>> np.multiply.reduce(np.arange(21)+1)
-4249290049419214848

Beide schlagen ohne Vorwarnung fehl, obwohl dies auch an einem Überlauffehler liegt. Die richtige Antwort ist, dass 21! gleich

In [47]: import math

In [48]: math.factorial(21)
Out[50]: 51090942171709440000L

Laut zahlreicher Entwickler, Robert Kern ,

Im Gegensatz zu echten Gleitkommafehlern (bei denen die Hardware-FPU ein Flag setzt, wenn sie eine Atomoperation ausführt, die überläuft) müssen wir die Ganzzahlüberlauferkennung selbst implementieren. Wir machen das auf den Skalaren, aber nicht auf Arrays, weil es zu langsam wäre, es für jede atomare Operation auf Arrays zu implementieren.

Sie müssen also das geeignete dtypes auswählen, damit keine Operation überläuft.

50
unutbu

Eine einfache Möglichkeit, dieses Problem zu beheben, ist die Verwendung von 64-Bit-Typ

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