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



## baumi44 (21. Apr 2012)

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?


----------



## nillehammer (21. Apr 2012)

> 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.


----------



## baumi44 (21. Apr 2012)

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??


----------



## Noctarius (21. Apr 2012)

Liegt vermutlich an der Rundung von "0.0"


----------



## nillehammer (22. Apr 2012)

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:

```
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.


----------



## xehpuk (22. Apr 2012)

nillehammer hat gesagt.:


> 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.


----------



## nillehammer (22. Apr 2012)

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


----------

