Frage zu Klausur über Java

donsems

Mitglied
Hallo

in der prozeduralen Programmierung mit Java habe ich das folgende Problem.

Java:
float sum = 0;
for(float i=1; i<=100000; i++){
sum=sum+1/i;
}
g.drawString(""+sum,10,10);
Ausgabe: 12.090851

versus
Java:
float sum = 0;
for(float i=100000; i>0; i--){
sum=sum+1/i;
}
g.drawString(""+sum,10,10);
Ausgabe: 12.090153

Nun lautet die Frage. Warum ein Unterschied zwischen den Ausgaben vorkommt?

Die Anzahl der Summierungen in der for-Schleife ist meiner Meinung nach die gleiche. Stimmt das?
 
Das Rechnen mit float/double ist ungenau. Einfachstes Beispiel:

Java:
System.out.println( 2.0 - 1.1 );

Das liegt daran dass sie einen sehr großen Wertebereich haben, allerdings eine dafür zu kleine Speicherbelegung. Entsprechend werden immer nur einige Stellen der eigentlichen Zahl abgespeichert, und andere Stellen verworfen. Damit kann man halt dann nicht genau rechnen. Und bei diesen Rundungsfehlern macht es einen Unterschied in welcher Reihenfolge sie passieren. Wenn du von 0 nach 12,xx hochzählst passieren in diesem Prozess nun mal andere Rundungen als wenn du von 12,xx nach 0 runterzählst.

Wenn du genaue Berechnungen haben willst, musst du die Klasse BigDecimal verwenden.
 
Es liegt schlichtweg am Runden bei der 7. Stelle. So kommt abhängig der Reihenfolge wie addiert wird, es zu leichten Abweichungen (wenn Runden durchgeführt wird).

Gut Testen kannst du das z.B. schon mit der Zahl 9. Wie du siehst sind die Zwischenergebnisse identisch, erst beim summieren entsteht die Ungenauigkeit.

Java:
public static void main(String[] strings) {

		float sum = 0;
		for (float i = 1; i <= 9; i++) {
			sum = sum + (1 / i);
			System.out.println("Summe: "+sum+" Zwischenergebnis:"+1/i);
		}
		System.out.println("#####"+sum);

		sum = 0;
		for(float i=9; i>0; i--) {
			sum = sum + (1 / i);
			System.out.println("Summe: "+sum+" Zwischenergebnis:"+1/i);
		}
		System.out.println("#####"+sum);
	}

Java:
Summe: 1.0 Zwischenergebnis:1.0
Summe: 1.5 Zwischenergebnis:0.5
Summe: 1.8333334 Zwischenergebnis:0.33333334
Summe: 2.0833335 Zwischenergebnis:0.25
Summe: 2.2833335 Zwischenergebnis:0.2
Summe: 2.4500003 Zwischenergebnis:0.16666667
Summe: 2.5928574 Zwischenergebnis:0.14285715
Summe: 2.7178574 Zwischenergebnis:0.125
Summe: 2.8289685 Zwischenergebnis:0.11111111
#####2.8289685
Summe: 0.11111111 Zwischenergebnis:0.11111111
Summe: 0.2361111 Zwischenergebnis:0.125
Summe: 0.37896824 Zwischenergebnis:0.14285715
Summe: 0.5456349 Zwischenergebnis:0.16666667
Summe: 0.7456349 Zwischenergebnis:0.2
Summe: 0.9956349 Zwischenergebnis:0.25
Summe: 1.3289683 Zwischenergebnis:0.33333334
Summe: 1.8289683 Zwischenergebnis:0.5
Summe: 2.8289683 Zwischenergebnis:1.0
#####2.8289683

[edit] ok das beispiel zeigt nicht das, was ich wollte[/edit]
 
Zuletzt bearbeitet:

Zurück
Oben