Frage

Verzeihen Sie mir, wenn das ein blödes Anfängerproblem ist, aber ich verstehe es wirklich nicht.

Ich habe eine Mitgliedsvariable wie folgt deklariert:

public Double Value;

Wenn ich dem Wert 3,14159265 zuweise und versuche, den Sinus davon zu berechnen, passiert Folgendes:

system.out.println(Value.toString()); //outputs 3.14159265
Value = Math.sin(Value);
system.out.println(Value.toString()); //outputs NaN

Tatsächlich passiert dies bei jedem einzelnen Wert, den ich ausprobiert habe – sogar bei 0!Math.sin() scheint als Ergebnis immer NaN zu erzeugen, unabhängig vom Argumentwert.

Die Dokumente sagen:

Wenn das Argument NaN oder eine Unendlichkeit ist, ist das Ergebnis NaN.

Aber mein Argument ist eindeutig nicht NaN oder Unendlich!

Was zum Teufel passiert da?

AKTUALISIEREN

Es stellte sich heraus, dass ich der dümmste Programmierer der Welt bin.In meinem Projekt ist der gesamte Code natürlich deutlich komplexer als im obigen Beispiel.Es ist eine Art Ausdrucksparser und -auswerter und für die definierten mathematischen Funktionen verwende ich eine Switch-Klausel, um zu entscheiden, welche Funktion aufgerufen werden soll – Ich habe die break-Anweisung in den Fällen vergessen was dazu führte, dass die sqrt-Funktion mit einem negativen Parameter ausgeführt wurde.

Wie gesagt – der dümmste Programmierer der Welt …

Ich habe die oberste Antwort akzeptiert, da sie meiner Meinung nach die beste ist.Tut mir leid, Leute, dass ihr eure Zeit verschwendet habt -.-

War es hilfreich?

Lösung

Double value = 3.14159265;
System.out.println(value.toString()); //outputs 3.14159265
value = Math.sin(value);
System.out.println(value.toString()); //outputs NaN

Ausgänge (wie erwartet):

3.14159265
3.5897930298416118E-9

Das Problem sollte also woanders liegen. Welche JDK-Version verwenden Sie?Ist es 32 Bit oder 64 Bit?Gibt es in der Mitte noch anderen Code, den Sie nicht eingefügt haben?

Der einzige Weg, eine zu erhalten NaN aus Math.sin ist durch die Verwendung inf Ö NaN als Parameter.Und ohne diesen Wert explizit einer Zahl zuzuweisen, können Sie ihn einfach durch falsche Berechnungen erhalten, z. B.:

Double d = 0.0/0.0;
System.out.println(Math.sin(d));
double d2 = Double.POSITIVE_INFINITY;
System.out.println(Math.sin(d2));

Dies wird Folgendes ausgeben: NaN zweimal.

Zwei Anmerkungen:

  • Verwenden Sie keine Großbuchstaben für Variablen (verwenden Sie value, nicht Value)
  • Wenn Sie Strings als Parameter (oder in andere Strings zusammengesetzt) ​​benötigen, müssen Sie sie nicht explizit aufrufen toString(), du kannst tun System.out.println(value)

Andere Tipps

Das ist, was ich bekommen:

Double Value;
Value = 3.14159265 ;
System.out.println(Value.toString()); //outputs 3.14159265
Value = Math.sin(Value);
System.out.println(Value.toString()); //outputs 3.5897930298416118E-9

So gibt es 2 Möglichkeiten:

  1. Der Code, den Sie ist geschrieben nicht der Code, den Sie verwenden (Ich bemerke Sie haben einen niedrigeren Fall S auf dem System, so wird dies nicht kompilieren)
  2. Etwas anderes ist der Wert der Wert auf NaN ändern, bevor oder nachdem Sie tun, um die Math.sin

Für den Anfang sind Sie die Double Referenz (Wrapper) Typ verwendet wird, nicht die double Urtyp - warum? Was ist der Code, dass Sie tatsächlich Value initialisieren mit (was, BTW, sollte nicht mit einem Großbuchstaben auf gemeinsamen Java Coding-Standards basieren starten)? Meine Vermutung ist, dass Sie gerade nicht Value richtig initialisiert wird. Versuchen Sie, beginnend mit mit einem double (keine Double).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top