Witzige Differenz.

Status
Nicht offen für weitere Antworten.

Manfred

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

Code:
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
 

Manfred

Bekanntes Mitglied
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!!!!
 

Manfred

Bekanntes Mitglied
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 !
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben