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)
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.
Eine einfache Möglichkeit, dieses Problem zu beheben, ist die Verwendung von 64-Bit-Typ
list = numpy.array(list, dtype=numpy.float64)