Python RuntimeWarning: Überlauf bei langen Skalaren aufgetreten

Lesezeit: 3 Minuten

Python RuntimeWarning Uberlauf bei langen Skalaren aufgetreten
timkado

Ich bin neu im Programmieren. In meinem neuesten Python 2.7-Projekt bin ich auf Folgendes gestoßen:

RuntimeWarning: Überlauf in long_scalars aufgetreten

Könnte mir bitte jemand erklären, was das bedeutet und was ich tun kann, um das zu beheben?

Der Code wird durchlaufen, aber ich bin mir nicht sicher, ob es eine gute Idee ist, die Warnung einfach zu ignorieren.

Dies geschieht während eines Anfügevorgangs wie:

SomeList.append(VeryLongFormula)

  • Würdest du bitte zeigen a kurzes, vollständiges Beispiel das demonstriert dieses problem?

    – Greg Hewgill

    26. September ’11 um 18:36


  • Sie haben das numpy-Tag eingefügt. Nichts in Ihren Fragen deutet auf numpy hin. Sie haben keinen Code eingefügt, der es uns ermöglicht, den Fehler zu reproduzieren. Bitte tun Sie dies.

    – David Heffernan

    26. September ’11 um 18:36

  • mögliches Duplikat von stackoverflow.com/questions/3767409/…

    – Rocksportrocker

    26. September ’11 um 18:36

1641949792 248 Python RuntimeWarning Uberlauf bei langen Skalaren aufgetreten
unutbu

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

ergibt

RuntimeWarning: overflow encountered in long_scalars

Im obigen Beispiel passiert es, weil a ist von dtype int32, und der in an . speicherbare Maximalwert int32 ist 2**31-1. Seit 10**10 > 2**32-1, ergibt die Potenzierung eine Zahl, die größer ist als die, die in an . gespeichert werden kann int32.

Beachten Sie, dass Sie sich nicht darauf verlassen können np.seterr(all="warn") 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 scheitern ohne Vorwarnung, obwohl es auch an einem Überlauffehler liegt. Die richtige Antwort lautet: 21! gleich

In [47]: import math

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

Laut numpy-Entwickler Robert Kern,

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

Es liegt also bei Ihnen, das Richtige zu wählen dtypes damit kein Vorgang überläuft.

  • Danke! Wie definiere ich, welchen Dtype ich möchte?

    – timkado

    26. September ’11 um 19:11


  • Sie können die dtype beim Erstellen des numpy-Arrays. In meinem obigen Beispiel können Sie beispielsweise den Überlauffehler vermeiden, indem Sie Folgendes einstellen: A = np.array([10],dtype='int64')

    – unutbu

    26. September ’11 um 19:24

  • Hier ist ein Liste der grundlegenden dtypes.

    – unutbu

    26. September ’11 um 19:26

  • Vielen Dank!!! Ich habe die Variablen AF und RT in float64 umgewandelt: AF = np.float64(AF) und die Warnung ist weg.

    – timkado

    26. September ’11 um 19:50

  • @Zelphir: Danke für den Hinweis. Sie haben Recht – auf 32-Bit-Betriebssystemen np.multiply.reduce(np.arange(17)+1) kehrt zurück -288522240 (ideone-demo), aber auf 64-Bit-Betriebssystemen gibt es die richtige Antwort zurück, 355687428096000. Ich habe das Beispiel im obigen Beitrag geändert in np.multiply.reduce(np.arange(21)+1) die sowohl auf 32-Bit- als auch auf 64-Bit-Betriebssystemen überläuft.

    – unutbu

    14. Januar ’16 um 14:40 Uhr


1641949792 868 Python RuntimeWarning Uberlauf bei langen Skalaren aufgetreten
Khaled

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

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

.

404180cookie-checkPython RuntimeWarning: Überlauf bei langen Skalaren aufgetreten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy