Was sind alle möglichen Berechnungen, die bewirken könnten, dass ein NaN in Python?
Ich habe gewesen suchend um, und es scheint verstreut Diskussionen über NaN
s in verschiedenen Programmiersprachen, darunter auch einige spezifische Fälle, aber nichts vollständig oder klar.
Was sind die häufigsten Operationen, die dazu führen würde, dass ein NaN
in Python, die entstehen während der Arbeit mit NumPy oder SciPy?
- Du wirst sehr viel genauer als das. Wenn Sie inklusive der Bibliotheken (Einbeziehung der numpy-tag würde vorschlagen, Sie sind), dann ist es eine völlig offene Frage. Seit 2.6, "Verhalten in besonderen Fällen soll nun Folgen C99 Anhang F. In früheren Versionen von Python, das Verhalten in besonderen Fällen wurde nur grob angegeben."
- Sie hat den numpy-tag, das ist nicht äquivalent zu deiner Frage:
0/0
in Python, wirft ZeroDivisionError, mit numpy (mit C unter der Haube), erhalten Sie ein NaN. - So wie es jetzt steht, obwohl, Ihre Frage ist zu breit für SO: es gibt keine klare use-case. Vielleicht programmers.stackexchange.com kann ein Ort sein, diese Frage zu stellen.
- Aus der python-docs die ich gefunden habe: NaN (not a number). Für mehr Informationen über NaN finden Sie unter IEEE 754 standards. en.wikipedia.org/wiki/IEEE_floating_point
- Vielleicht ist die Frage breit, aber es ist eine gute Frage, weil Sie die Antwort auf ein wichtiges problem, das oft Auftritt: Sie erhalten eine
nan
aus einem code und Sie wissen nicht warum. Wenn die OP rephrases sich die Frage, was sind die häufigsten/wahrscheinlichsten Ursachen einernan
bei der Arbeit mitnumpy/scipy
, die nicht stammen aus anderen Bibliotheken, die ich zu Stimmen, um Sie erneut zu öffnen. - Ich habe umformuliert es, wie Sie sagte.
- Ich weiß nicht einmal sehen, was war "zu breit" über die ursprüngliche Frage. Es gibt endlich viele Möglichkeiten, um einen NaN-und zu wissen, alle von Ihnen ist ein hervorragendes Ziel. Soweit ich sehen kann, die ursprüngliche Frage war eindeutig, die ausreichend schmal ist, und on-topic.
- Für möglich nahe Wähler: bitte besuchen Sie dieser meta-Frage, bevor Sie Ihre Stimme...
- nicht wirklich. Viele Bibliotheken, die Rückkehr (oder Rückkehr)
nan
unter bestimmten Umständen, definiert durch die Bibliothek anstelle der Rückgabe eine Ausnahme zum Beispiel. Sie sind eine endliche, aber sehr große Anzahl von Fällen. - Die Frage ist nicht wirklich Fragen Sie über "viele Bibliotheken." Auch nicht die ursprüngliche Frage.
- Sind wir oder sollten wir nicht zu haben, schließen und erneut öffnen Kriege?
- Kommentar darüber, ob eine Frage, die sollte oder sollte nicht geschlossen werden am besten gerichtet an Meta, vor allem, wenn Sie denken, es ist ein ständiges problem. Es wird hier gar nichts machen, andere als die Injektion Allgemeine Negativität.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie eine der folgenden, ohne herumalbern mit dem floating-point-Umgebung, sollten Sie ein NaN, wo Sie nicht schon vorher:
0/0
(entweder Zeichen oben und unten)inf/inf
(entweder Zeichen oben und unten)inf - inf
oder(-inf) + inf
oderinf + (-inf)
oder(-inf) - (-inf)
0 * inf
undinf * 0
(entweder Unterschreiben Sie auf beiden Faktoren)sqrt(x)
wennx < 0
fmod(x, y)
wenny = 0
oderx
ist unendlich; hierfmod
ist floating-point-Rest.Die kanonische Referenz für diese Aspekte der Maschine Arithmetik ist die IEEE-754-Spezifikation. Abschnitt 7.1 beschreibt die invalid operation exception, das ist die eine, die ausgelöst wird, wenn Sie etwa, um einen NaN. "Ausnahme" im IEEE-754 bedeutet etwas anderes als in einer Programmiersprache Zusammenhang.
Viele Besondere Funktion Implementierungen dokumentieren Ihr Verhalten bei Singularitäten der Funktion, die Sie versuchen zu implementieren. Siehe die man-Seite für
atan2
undlog
zum Beispiel.Fragen Sie konkret über NumPy und SciPy. Ich bin mir nicht sicher, ob dies ist einfach zu sagen "ich bin zu Fragen, über die Maschine, die Arithmetik, das passiert unter der Haube in NumPy" oder "ich Frage nach
eig()
und so." Ich nehme an der ehemaligen, aber der rest dieser Antwort versucht, eine vage Verbindung zu den übergeordneten Funktionen in NumPy. Die Grundregel ist: Wenn die Implementierung einer Funktion verpflichtet eine der oben genannten Sünden, erhalten Sie ein NaN.Für
fft
, zum Beispiel, sind Sie haftbar zu erhaltenNaN
s wenn Sie Ihre Eingabe-Werte sind um1e1010
oder größer und eine Stille Verlust der Genauigkeit, wenn Sie Ihre Eingabewerte sind rund1e-1010
oder kleiner. Abgesehen von wirklich lächerlich skaliert Eingänge, wenn Sie sich ganz sicher mitfft
.Für Dinge mit matrix math, NaNs zuschneiden können (in der Regel durch die
inf - inf
route), wenn Sie Ihre zahlen sind riesig oder die matrix ist sehr schlecht konditioniert. Eine komplette Diskussion, wie Sie bekommen können screwed durch die numerische lineare algebra ist zu lang, zu gehören, in einer Antwort. Ich würde vorschlagen, über eine numerische lineare algebra Buch (Trefethen und Bau populär ist), die im Laufe von ein paar Monaten statt.Eine Sache, die ich gefunden habe, nützlich beim schreiben und Debuggen von code, "sollte nicht" generieren NaNs ist zu sagen, die Maschine zu trap, wenn ein NaN-Auftritt. In GNU-C kann ich dies tun:
nan + <anything>
,nan * <anything>
usw. (Natürlich haben Sie sagen, "wo Sie nicht schon vorher", die schließt diesen. Immer noch wahrscheinlich lohnt sich, explizit zu erwähnen, dass nan ' s propagieren und durch keine Berechnung.)