Gleitpunktzahlen

tommyD

Mitglied
Hallo,

hätte eine interessante Frage bezüglich den Gleitpunktzahlen.

und zwar habe ich zwei Schleifen:

Code:
float sum1 = 0.0f;
for (int i = 1; i <= N; i++)
  sum1 = sum1 +1.0f / i;

System.out.println(sum1);


Code:
float sum2 = 0.0f;
for (int i = N; i >=1; i--)
  sum2 = sum2 +1.0f / i;

System.out.println(sum2);



Jetzt probiert das mal für große N. Also 10^6, 10^7 ect.

Müsste es hier nicht die Gleichen Ergebnisse geben? Hat der Compiler nur eine beschränkte Zahlendarstellung oder warum ist es egal ob 10^8 oder 10^9?

Würde mich über ein paar Antworten freuen :)

lg
 

nvidia

Bekanntes Mitglied
[...]
Müsste es hier nicht die Gleichen Ergebnisse geben? Hat der Compiler nur eine beschränkte Zahlendarstellung oder warum ist es egal ob 10^8 oder 10^9?
[...]

Das liegt nicht am Compiler und auch nicht an Java, das liegt an der vorherrschenden Darstellung von Gleitpunktzahlen im Rechner. Das Problem hast du in jeder Programmiersprache wenn du nicht auf Typen unbeschränkter Genauigkeit ausweichst. Über die Jahre wurden Methoden entwickelt den Fehler möglichst gering zu halten. Eine sehr leicht verdauliche Beschreibung zum Problem selbst findest du hier (Complete) Tutorial to Understand IEEE Floating-Point Errors. Eine umfassendere Beschreibung findet sich hier What Every Computer Scientist Should Know About Floating Point Arithmetic Und eine bekannte Methode um den Fehler möglichst gering zu halten wäre diese hier Kahan summation algorithm - Wikipedia, the free encyclopedia.
 

nvidia

Bekanntes Mitglied
Was ich noch vergessen habe hinzu zufügen. Lass die "normale" Summe (also von 1 bis n) mal mit Hilfe von BigDecimal ausrechnen, da wirst du schon die nächste Überraschung erleben. ;)
 

Ähnliche Java Themen

Neue Themen


Oben