Hallo Community,
mal ne ganz anfängerhafte Frage. In einem Buch steht
float a =–16777217F;
float b =16777216F;
float c =1F;
System.out.println( a + b + c ); // 1.0
System.out.println( a +(b + c)); // 0.0
mit der Erklärung: Mathematisch ergibt –16777217 + 16777216 den Wert –1, und –1 plus +1 ist 0. Im zweiten Fall liefert –16777217 + (16777216 + 1) = –16777217 + 16777217 = 0. Doch Java wertet a + b durch die Beschränkung von float zu 0 aus, sodass mit c addiert, also 1, die Ausgabe 1 statt 0 erscheint.
Das kam mir aber doch merkwürdig vor und ich habe es getestet und tatsächlich ergibt a + b + c "1.0" als Ergebnis. Das finde ich komisch und die Erklärung mit der "Beschränkung von float" verstehe ich auch nicht, da die float-Grenzen nach offizieller Spezifikation so aussehen:
4 bytes, IEEE 754. Covers a range from 1.40129846432481707e-45 to 3.40282346638528860e+38 (positive or negative)
Außerdem würde der negative Ast bei 2^31 spielend mit der Zahl –16777217, das bei 2^24 liegt, doch spielend zurecht kommen! Scheinbar funktionieren Gleitkommazahlen anders als ich weiß. Kann mir jemand da raushelfen? Danke!
mal ne ganz anfängerhafte Frage. In einem Buch steht
float a =–16777217F;
float b =16777216F;
float c =1F;
System.out.println( a + b + c ); // 1.0
System.out.println( a +(b + c)); // 0.0
mit der Erklärung: Mathematisch ergibt –16777217 + 16777216 den Wert –1, und –1 plus +1 ist 0. Im zweiten Fall liefert –16777217 + (16777216 + 1) = –16777217 + 16777217 = 0. Doch Java wertet a + b durch die Beschränkung von float zu 0 aus, sodass mit c addiert, also 1, die Ausgabe 1 statt 0 erscheint.
Das kam mir aber doch merkwürdig vor und ich habe es getestet und tatsächlich ergibt a + b + c "1.0" als Ergebnis. Das finde ich komisch und die Erklärung mit der "Beschränkung von float" verstehe ich auch nicht, da die float-Grenzen nach offizieller Spezifikation so aussehen:
4 bytes, IEEE 754. Covers a range from 1.40129846432481707e-45 to 3.40282346638528860e+38 (positive or negative)
Außerdem würde der negative Ast bei 2^31 spielend mit der Zahl –16777217, das bei 2^24 liegt, doch spielend zurecht kommen! Scheinbar funktionieren Gleitkommazahlen anders als ich weiß. Kann mir jemand da raushelfen? Danke!