Was bedeutet ein . bei (1./0.) ??

B

baumi44

Gast
Welche Aussage ist zu folgendem Code-Fragment richtig?


int i= (int) (1./0.);
System.out.println(i);

a. Der Compiler meldet in der ersten Zeile einen Fehler.
b. Bei der Ausführung wird eine Exception aufgrund der Division durch Null generiert.
c. Die Ausgabe ist: Infinity
d. Die Ausgabe ist: 2147483647


ich habe es bereits ausprobiert und ich komme auf Antwort d. Mir ist jedoch nicht bewusst, was dieser Punkt nach dem 1er und 0 er bedeutet. Wenn ich ihn bei 1 weglasse, ändert sich nichts. Lass ich den Punkt beim 0er weg bekomme ich eine Fehlermeldung. Ich hoffe mir kann hier wer weiterhelfen. ==> kann ich daraus schlussfolgern, dass Antwort b auch richtig ist?? Wenn ja wie sieht diese Ausnahme aus?
 
N

nillehammer

Gast
Mir ist jedoch nicht bewusst, was dieser Punkt nach dem 1er und 0 er bedeutet.
Das ist die Kurzschreibweise für "1.0" bzw "0.0" (Also Eins Komma Null bzw Null Komma Null). Wusste ich bis eben aber ehrlich gesagt auch nicht, dass es geht.
kann ich daraus schlussfolgern, dass Antwort b auch richtig ist??
Natürlich nicht! Du sollst den Code doch so interpretieren, wie er da steht. Wenn Du den Code änderst kommt möglicherweise was anderes raus, aber das hat mit der Frage dann nichts mehr zu tun.
Wenn ja wie sieht diese Ausnahme aus?
Probier's doch einfach aus.
 
B

baumi44

Gast
hab ich auch schon vermutet, aber wieso ist die Division durch 0 fehlerhaft und durch 0.0 nicht?? Ist das so zu verstehen, dass mit 0.0 eine Zahl x<<0 ist aber eben nicht 0 sodass eigtl unendlich rauskommen würde, aber dadurch dass integer mit 2147483647 nach oben hin beschränkt ist, somit dieser Wert ausgegeben wird??
 
N

nillehammer

Gast
Noctarius hat gesagt.:
Liegt vermutlich an der Rundung von "0.0"
Die Vermutung stimmt nicht. 0.0 ist einer der Fälle, wo die Zahl exakt ist. Folgender Code zeigt das:
Java:
System.out.println(Long.toBinaryString(Double.doubleToLongBits(0.0)));
Wie man sieht, sind alle Bits wirklich 0.
baumi44 hat gesagt.:
hab ich auch schon vermutet, aber wieso ist die Division durch 0 fehlerhaft und durch 0.0 nicht?? Ist das so zu verstehen, dass mit 0.0 eine Zahl x<<0 ist aber eben nicht 0 sodass eigtl unendlich rauskommen würde, aber dadurch dass integer mit 2147483647 nach oben hin beschränkt ist, somit dieser Wert ausgegeben wird??
Das Ergebnis der Division durch 0.0 ist laut Java-Spezifikation als "not a number" definiert. Dafür gibt es sowohl bei Float als auch bei Double eine fest definierte Bitfolge. In den Wrapper-Klassen sind dafür Konstanten definiert (Float.NaN und Double.NaN). Das Bitmuster dieser Konstante wird in Deinem Beispielcode durch den cast in einer int-Variablen gespeichert. Bei int entspricht sie dem Wert 2147483647. Das ist der technische Hintergrund. Jetzt kann man nach dem Grund fragen, warum genau diese Bitfolge für NaN gewählt wurde. Und da denke ich ist Deine Erklärung recht schlüssig.
 
Zuletzt bearbeitet von einem Moderator:

xehpuk

Top Contributor
Das Ergebnis der Division durch 0.0 ist laut Java-Spezifikation als "not a number" definiert. Dafür gibt es sowohl bei Float als auch bei Double eine fest definierte Bitfolge. In den Wrapper-Klassen sind dafür Konstanten definiert (Float.NaN und Double.NaN). Das Bitmuster dieser Konstante wird in Deinem Beispielcode durch den cast in einer int-Variablen gespeichert. Bei int entspricht sie dem Wert 2147483647.
Das ist nicht korrekt. Nur 0.0/0.0 ergibt NaN. NaN == Double.doubleToLongBits(0x7ff8000000000000L), also als int 0.
1.0/0.0 ergibt Double.POSITIVE_INFINITY, und das wiederum ist als int Integer.MAX_VALUE. (Das erklärt die Ausgabe.)
-1.0/0.0 ergibt Double.NEGATIVE_INFINITY, und das wiederum ist als int Integer.MIN_VALUE.
 
N

nillehammer

Gast
xehpuk hat Recht. Hätte die Spezifikation genauer lesen sollen... oder eine Zeile mehr Testcode schreiben.:autsch:
 

Neue Themen


Oben