Discussion:
NaN und Infinity
(zu alt für eine Antwort)
Ringo Grafe
2005-03-13 18:33:42 UTC
Permalink
Hallo,

folgender Code

double d1 = 0/0.0;
double d2 = 5/0.0;
double d1round = Math.round(d1*100.)/100.;
double d2round = Math.round(d2*100.)/100.;

System.out.println(d1);
System.out.println(d1round);
System.out.println(d2);
System.out.println(d2round);

liefert als Ausgabe
NaN
0.0
Infinity
9.223372036854776E16

Die Ergebnisse NaN und Infinity machen Sinn. Aber wieso ist der Rundungswert
von einer Zahl - die eigentlich keine ist - 0.0 und der Rundungswert von
Unendlich 9.22E16? Gibt es eine Möglichkeit einen vorhandenen double Wert
auf NaN oder Infinity zu testen?

mfg
ringo
Hauke Ingmar
2005-03-13 19:16:17 UTC
Permalink
Post by Ringo Grafe
folgender Code
double d1 = 0/0.0;
double d2 = 5/0.0;
double d1round = Math.round(d1*100.)/100.;
double d2round = Math.round(d2*100.)/100.;
System.out.println(d1);
System.out.println(d1round);
System.out.println(d2);
System.out.println(d2round);
liefert als Ausgabe
NaN
0.0
Infinity
9.223372036854776E16
Die Ergebnisse NaN und Infinity machen Sinn. Aber wieso ist der Rundungswert
von einer Zahl - die eigentlich keine ist - 0.0 und der Rundungswert von
Unendlich 9.22E16? Gibt es eine Möglichkeit einen vorhandenen double Wert
auf NaN oder Infinity zu testen?
Die Rechnung mit einem NaN-Wert liefert laut JLS NaN.
System.out.println(d1*100./100.); bestätigt dies.

Du machst aber etwas ganz anderes. Du benutzt Math#round, welches ein
spezifiziertes, jedoch möglicherweise (bei Dir bestimmt :-) unerwartetes,
Ergebnis liefert. Alles weitere steht bei Math#round in den JavaDocs.

Ach ja, Double#isNaN(double) und Double#isInfinite(double) gibt es auch.

Bis denn
Paul Ebermann
2005-03-13 23:25:00 UTC
Permalink
Post by Ringo Grafe
folgender Code
double d1 = 0/0.0;
double d2 = 5/0.0;
double d1round = Math.round(d1*100.)/100.;
double d2round = Math.round(d2*100.)/100.;
[...]
Post by Ringo Grafe
liefert als Ausgabe
0.0
9.223372036854776E16
Die Ergebnisse NaN und Infinity machen Sinn. Aber wieso ist der Rundungswert
von einer Zahl - die eigentlich keine ist - 0.0 und der Rundungswert von
Unendlich 9.22E16?
Das liegt an der Implementation von Math.round().

Diese arbeitet intern mit einem Cast auf long.
In long gibt es weder NaN noch Infinity, und daher
wird aus NaN eine Null und aus Infinity die größte
long-Zahl.
Post by Ringo Grafe
Gibt es eine Möglichkeit einen vorhandenen double Wert
auf NaN oder Infinity zu testen?
Hat Hauke ja schon genannt:
Double.isInfinity() und Double.isNaN().
Die Implementationen davon sind übrigens in Java
gemacht: NaN ist ein Wert, für den "x != x" gilt
(und der einzige solche), die beiden Infinities
kannst du als 1.0/0.0 und -1.0/0.0 herstellen und
damit vergleichen.


In deinem Fall hilft vielleicht Math.rint() - lies
dir mal die API dazu durch.


Paul
--
The Java Language Specification: http://java.sun.com/docs/books/jls/index.html
Frank Dreyer
2005-03-14 12:11:43 UTC
Permalink
Post by Paul Ebermann
die beiden Infinities
kannst du als 1.0/0.0 und -1.0/0.0 herstellen
Oder direkt in Double.NEGATIVE_INFINITY / Double.POSITIVE_INFINITY finden
Lesen Sie weiter auf narkive:
Loading...