Wann sollte NaN oder +/- Infinity verwendet werden?

7

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?

    
LZW 27.02.2013, 16:43
quelle

5 Antworten

9

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.

    
Eric Postpischil 27.02.2013 16:56
quelle
7

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.

    
JerKimball 27.02.2013 16:46
quelle
6
  

Wenn es Konstanten wie diese gibt, warum float.Parse("a") wirft Fehler, anstatt float.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.

    
Konrad Rudolph 27.02.2013 16:47
quelle
1

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

    
Meirion Hughes 27.02.2013 16:51
quelle
0

Um NAN und unendlich aufzulösen, benutze dies:

%Vor%     
Anis Ben Khiroun 27.10.2016 11:28
quelle

Tags und Links