Was sind die Vorteile von NaN
, PositiveInfinity
oder NegativeInfinity
für float
und double
? Wann sollten wir sie verwenden oder vermeiden?
Wenn es solche Konstanten gibt, warum gibt float.Parse("a")
einen Fehler aus, anstatt float.NaN
zurückzuliefern?
Wie ist NaN
anders als null
? Warum ist division by zero
sogar für Floating-Typen möglich?
Infinitäten werden verwendet, weil sie Teil des arithmetischen Systems sind, das durch Fließkomma unterstützt wird. Es gibt verschiedene Operationen, wie z. B. das Teilen durch Null, in denen Unendlichkeit ein nützliches Ergebnis ist und mathematisch sinnvoll ist. Offensichtlich kann keine direkte physikalische Größe unendlich sein (Sie können zum Beispiel nicht unendlich viele Gramm haben), aber unendlich kann ein nützlicher Wert für irgendeinen Aspekt eines mathematischen Modells physikalischer Prozesse oder anderer Dinge sein, die Menschen mit Computern modellieren.
>NaNs werden verwendet, weil das arithmetische System unvollständig ist. Das heißt, es gibt Operationen mit Eingabewerten, für die das richtige mathematische Ergebnis nicht innerhalb des Fließkommas dargestellt werden kann. Zum Beispiel ist sqrt (-1) eine legitime mathematische Operation, aber das Ergebnis, die imaginäre Zahl i , ist im Fließkomma nicht darstellbar. NaN wird also als Platzhalter verwendet, um anzuzeigen, dass die Werte die Gleitkommazahlen verlassen haben. NaN kann auch für andere Zwecke verwendet werden, z. B. das Markieren von Daten, die sonst nicht initialisiert werden, um das Debuggen zu erleichtern.
float.Parse("a")
gibt einen Fehler aus und gibt kein NaN zurück, da es sich um eine nicht zulässige Operation handelt. Dieser Ausdruck führt keine mathematische Operation aus, die außerhalb der darstellbaren Zahlen ein korrektes Ergebnis hat. Es ist ein tatsächlicher Fehler, daher wird ein Fehler ausgegeben.
Sie sind nicht so sehr etwas, was Sie benutzen , denn sie müssen Sie beachten:
%Vor%Ausgabe:
%Vor%BEARBEITEN: Wie für diese Frage:
Wenn es solche Konstanten gibt, warum wirft float.Parse ("a") einen Fehler auf, anstatt float.NaN zurückzugeben?
double.NaN
ist eigentlich eine mathematische Definition in gewisser Weise - es ist "definiert" als 0.0/0.0
- während die Wörter "keine Zahl" bedeuten, dass etwas wie double.Parse("a")
auch double.NaN
zurückgeben soll, tut es nicht . Warum?
Meine Vermutung ist, dass es unmöglich wäre festzustellen, ob das double.NaN
, das Sie erhalten haben, das Ergebnis von Mülldaten (im Fall der Zeichenfolge) oder der tatsächlichen Definition einer unbestimmten Zahl ist. wie Null durch Null geteilt. Um also zwischen diesen beiden Fällen zu unterscheiden, gibt double.Parse("a")
eine Exception
aus, was meiner Ansicht nach genauer ist.
Wenn es Konstanten wie diese gibt, warum
float.Parse("a")
wirft Fehler, anstattfloat.NaN
zurückzugeben?
Weil keine der aufgeführten Alternativen hier anwendbar ist:
PositiveInfinity
und NegativeInfinity
sind genau das - d. h. sie sind das Ergebnis von Ausdrücken wie 1/0
oder -1/0
.
NaN
ist das Ergebnis von 0/0
- also ein Ausdruck, dessen Ergebnis nicht (normalerweise) gut definiert ist und nicht zu einer Zahl führt.
float.Parse("a")
ist nicht so. Zugegebenermaßen könnte es möglicherweise durch NaN
dargestellt werden, aber dann konnten Sie nicht zwischen dem Benutzer, der einen ungültigen float
Wert ( a
) und einen gültigen float
Wert ( NaN
) eingibt, unterscheiden. Dies ist jedoch kein sehr starkes Argument: NaN
ist explizit ein Platzhalter für eine ungültige Zahl, daher könnte es möglicherweise verwendet werden, um ungültige Benutzereingaben darzustellen.
Auf der anderen Seite gibt es andere Typen, die eine Parse
-Methode haben und für die kein NaN
-Wert existiert (wie zB int
). Bei diesen Typen muss Parse
daher einen Fehler melden. Es wäre inkonsistent (und daher schlechtes API-Design), dass sich die Parse
-Methode anderer Typen anders verhält.
Abgesehen von den Ergebnissen aus der Arithmetik können die Unendlichkeitswerte verwendet werden, um für einen Kontext keine Grenzen zu definieren.
Beispiel: Ein übergeordnetes WPF-Steuerelement, das eines seiner Kinder auffordert, sich selbst zu messen, unter der Voraussetzung, dass keine Größenbeschränkung besteht; d. h. availableSize ist PositiveInfinity
Hinweis: MeasureOverride