# Witzige Differenz.



## Manfred (20. Mai 2005)

Seht euch mal den Code an und überlegt mal, warum das Ergebniss unterschiedlich ist, eigentlich witzig...


```
public class Summe
{
    public static void main(String[] args)
    {
        double summe=0;
        double summeRetour=0;
        
        for(double i=1; i<=2000000; i++)
        {
            summe+=(1/i);
        }
        
        for(double i=2000000; i>=1; i--)
        {
            summeRetour+=(1/i);
        }
        System.out.println(summe);
        System.out.println(summeRetour);
    }
}
```

Ausgabe:
15.085873653425047
15.085873653425752


----------



## Illuvatar (20. Mai 2005)

Thread Nummer 3953 zu dem Thema :?

http://www.java-forum.org/de/viewtopic.php?t=16082


----------



## Sky (20. Mai 2005)

Manfred hat gesagt.:
			
		

> überlegt mal, warum das Ergebniss unterschiedlich ist


Sag mal bin ich hier bei Jeopardy ??

Hatten wir schon oft:
z.B.: http://www.java-forum.org/de/viewtopic.php?t=16082&highlight=

<Edit>zweiter...</Edit>


----------



## Manfred (20. Mai 2005)

Tja das Jeopardy scheint ja zu gefallen, sonst würden sich hier kaum so viele finden, alte Threads zu suchen, die aber doch etwas anders sind, ok der Ursprung ist der gleiche!

Wichtig ist nur, dass das 2te Ergebnis genauer ist!!!!


----------



## Sky (20. Mai 2005)

Manfred hat gesagt.:
			
		

> Wichtig ist nur, dass das 2te Ergebnis genauer ist!!!!


Gibt es dafür einen allgemeinen Mathematischen Beweis?


----------



## Manfred (20. Mai 2005)

Der Beweis hat nichts mit Mathematik zu tun, eher mit der internen Darstellung/Verarbeitung von Zahlen!
Ich versuche das mal darzustellen (obwohl mir das auch noch nicht 100%ig klar ist, also bitte nicht gleich aufregen, werde mich noch auf 100% informieren! Aber stimmen tut die Aussage sicher!)

Also bei der ersten Schleife passierts ja so:

1/1=1
1/2=0,5
1/3=0,333
usw

sprich wir haben ca. 1,8333

intern wird das so dargestellt (jetzt nicht auf Binär umgerechnet!)

0,183333333333 * 10^1

es können jedoch eine bestimme Anzahl von Stellen gespeichert werden, nehmen wir vereinfacht an 5 also folgt:

0,18333 *10^1

die nachfolgenden Zahlen der Division werden immer kleiner und können daher gar nicht mehr addiert werden! Also sehr ungenau! 
z.B. letzte Zahl 0,0000005
Darstellung: 0,50000 *10^-6

Zur Addition müss der Exponent aber angeglichen werden also
0,18333 *10^1
0,000005 *10^1

Der 5er fällt aber weg, da nur 5 Stellen zur Verfügung stehen!



Bei der anderen Schleife (Retour) passiert das ganze so:
1/2000000=0,0000005
1/1999999=0,0000004.....
usw

Darstellung im Rechner

0,500000 *10^-6

Die nächsten Zahlen (angenommen 0,000002 können so besser addiert werden und gehen nicht verloren) somit kann hier schon gerundet werden und die kleinen Zahlen werden mitübernommen bzw. besser beachtet!
Daher ist diese Methode genauer!

Wie gesagt, ich werde mir das noch genauer erklären lassen, aber stimmen tut´s !


----------



## 0xdeadbeef (31. Mai 2005)

So _witzig_ fand ich die Differenz jetzt gar nicht  :bae:


----------

