Reihenwert-Berechnung, Ergebnis mit vorherigem Ergebnis vergleichen

Stephan_kl

Mitglied
Hallo,
ich bin noch ziemlich neu bei der Java-Programmierung und befinde mich gerade im Medieninfortamik-Studium.
Zum Üben habe ich mir in Buch mit Java-Übungsaufgaben geholt und nun stehe ich bei einer Aufgabe irgendwie auf dem Schlauch.

Ich habe hier eine Formel zur Reihenwert-Berechnung, diese konnte ich auch schon umsetzen.
Das Ergebnis wird auch richtig ausgegeben denke ich.

Nun meine Frage, wie kann ich das Ergebnis der Berechnung mit dem Ergebnis des vorherigen Durchlaufs der Schleife vergleichen?
Ziel soll es sein die Berechnung zu stoppen wenn der Unterschied zum vorherigen Ergebnis kleiner als 10^-5 (zehn hoch minus fünf) ist.

Aktuell sieht mein Code wie folgt aus:

Java:
public class Aufgabe5_1 {

    public static void main(String[] args) {

        double zahl1 = 1;
        double potenz = Math.pow(10, -5);
        double ergebnis = 0;

        while (zahl1 < 50) {

            ergebnis = 6 * (1 / (zahl1 * zahl1));

            System.out.println(ergebnis);

            zahl1++;
        }
    }
}

Meine Idee war jetzt das Ergebnis der vorherigen Schleife vom aktuellen Ergebnis abzuziehen und mit der Potenz zu vergleichen. Ist die Änderung kleiner als die Potenz soll die Schleife beendet werden, also quasi als Bedingung dienen. Nur fällt mir gerade nicht ein wie ich das am besten umsetze.
Ich erwarte keine fertige Lösung, ein Hinweis in die richtige Richtung würde mir schon sehr helfen 🙂

vielen Dank schonmal.

Viele Grüße
Stephan
 
Beste Antwort
K
Die Zuweisung muss natürlich an einer anderen Stelle erfolgen. Die Zuweisung muss erfolgen, bevor ein neues Ergebnis berechnet wird.
Also bei dem gegebenen Code wäre das dann:

Java:
        while (Math.abs(ergebnis-vorherigesErgebnis)<0.1) {
            vorherigesErgebnis=ergebnis;
            ergebnis = 6 * (1 / (zahl1 * zahl1));
            System.out.println(ergebnis);
            zahl1++;
        }

Also erst merken, dann das neue berechnen....
Wenn ich es richtig verstanden habe, dann könntest du das Ergebnis jeweils zwischenspeichern damit du es beim nächsten Durchgang vergleichen kannst.

So etwas wie (müsstest du noch Feintunen) :
Java:
public class Aufgabe5_1 {

    public static void main(String[] args) {

        double zahl1 = 1;
        double potenz = Math.pow(10, -5);
        double ergebnis = 0;
        double vorherigesErgebnis = -1;

        while (Math.abs(ergebnis-vorherigesErgebnis)<0.1) {

            ergebnis = 6 * (1 / (zahl1 * zahl1));

            System.out.println(ergebnis);
            vorherigesErgebnis=ergebnis;
                    
            zahl1++;
        }
    }
}
 
Hallo,
vielen Dank für die schnelle Antwort.

Das klingt ja ganz schlimm 🥺

Ja, so schlimm ist Medieninformatik nicht 😉 mir geht das mit der Programmierung nur nicht weit genug, deshalb wollte ich das nebenbei etwas weiter ausbauen.

So etwas wie (müsstest du noch Feintunen) :
Java:
public class Aufgabe5_1 {

public static void main(String[] args) {

double zahl1 = 1;
double potenz = Math.pow(10, -5);
double ergebnis = 0;
double vorherigesErgebnis = -1;

while (Math.abs(ergebnis-vorherigesErgebnis)<0.1) {

ergebnis = 6 * (1 / (zahl1 * zahl1));

System.out.println(ergebnis);
vorherigesErgebnis=ergebnis;

zahl1++;
}
}
}

So hatte ich es auch schon, nur ist das das Problem dass Ergebnis und vorheriges Ergebnis nach der Zuweisung die gleichen Werte haben, somit kommt bei Rechnung ergebnis-vorherigesErgebnis 0 raus und die Kondition der While-Schleife wird nicht nie erreicht.

Irgendwie müsste ich das Ergebnis des vorherigen Durchlaufs speichern um das dann in die Rechnung zu übernehmen. Oder ist die While-Schleife eher ungünstig dafür?

Viele Grüße
Stephan
 
Die Zuweisung muss natürlich an einer anderen Stelle erfolgen. Die Zuweisung muss erfolgen, bevor ein neues Ergebnis berechnet wird.
Also bei dem gegebenen Code wäre das dann:

Java:
        while (Math.abs(ergebnis-vorherigesErgebnis)<0.1) {
            vorherigesErgebnis=ergebnis;
            ergebnis = 6 * (1 / (zahl1 * zahl1));
            System.out.println(ergebnis);
            zahl1++;
        }

Also erst merken, dann das neue berechnen....
 
Beste Antwort
Also erst merken, dann das neue berechnen....
Ah das wars. Ich wusste die Position der Zuweisung uns irgendwie vor die Berechnung.
Jetzt hat es auch geklappt mit der Berechnung.

Ich musste nur die Initialwerte vom Ergebnis etwas anpassen damit am Anfang nicht gleich -1 herauskommt und die Schleife beendet wird.

Java:
public class Aufgabe5_1 {

    public static void main(String[] args) {

        double zahl1 = 1;
        double potenz = Math.pow(10, -5);
        double ergebnis = 7;
        double vorherigesErgebnis = 6;
        double condition = 1;

        while (condition > potenz) {

            vorherigesErgebnis = ergebnis;

            ergebnis = 6 * (1 / (zahl1 * zahl1));

            System.out.printf("Ergebnis: %.5f\n", ergebnis);

            condition = vorherigesErgebnis - ergebnis;

            zahl1++;
        }

    }
}
 
Hallo,

es ist vorher bereits erwähnt worden (von @lara99) aber wohl verlorengegangen: Du sollst eine Reihenentwicklung (für PI^2, siehe https://de.wikipedia.org/wiki/Basler_Problem) berechnen, also muss es heißen:
Java:
ergebnis += 6 * (1 / (zahl1 * zahl1));
(Wichtig ist hier das "+" vor dem "=")

Damit weißt du auch, wie sich das neue Ergebnis vom alten Ergebnis unterscheidet (nämlich um 6 * (1 / (zahl1 * zahl1))).
Eine einfachere Version sähe damit folgendermaßen aus:
(Ich habe hier einen weiteren Hinweis von @lara99 aufgenommen, dass man Math.pow(10, -5) besser schreibt in der Form 1e-5)

Java:
public class Aufgabe5_1 {{

    public static void main(String[] args) {
        double ergebnis = 0;
        double potenz = 1e-5;
        double addiere = 1;
        double zahl1 = 1;

        while (addiere > potenz) {
            addiere = 6 * (1 / (zahl1 * zahl1));
            ergebnis += addiere;
            zahl1 += 1;
        }

        System.out.println(ergebnis);
        System.out.println(Math.PI * Math.PI); // nur zum Vergleich
    }
}
 
Zuletzt bearbeitet:
Noch zwei Bemerkungen:

- In meinem Code public class Aufgabe5_1 {{ ist nach der Kassendefinition natürlich eine Klammer zu viel.

- die Bemerkung
Das klingt ja ganz schlimm
bezog sich möglicherweise nur auf die falsche Schreibweise in

Gruß
Fritz

EDIT: Ich stelle mir gerade vor, was ein "Medieninfortamiker" alles machen kann - möglcherweise ist das ja der Beruf der Zukunft!
 
Zuletzt bearbeitet:
bezog sich möglicherweise nur auf die falsche Schreibweise in

Gruß
Fritz
Ja, darum ging es mir. Nach meiner Meinung sollte ein Student das Studienfach oder die Studienfächer, die er studiert, fehlerfrei buchstabieren können... Aber vielleicht bist du auch Legastheniker, deswegen will ich dir nicht zu nah treten. Jedenfalls erschwert es den um Hilfe Gefragten bei der Suche nach Antworten und ist zudem auch unfreundlich diesengegenüber. Also beim nächsten Mal einfach ein bisschen auf deine Rechtschreibung achten.
 
Ja, darum ging es mir. Nach meiner Meinung sollte ein Student das Studienfach oder die Studienfächer, die er studiert, fehlerfrei buchstabieren können... Aber vielleicht bist du auch Legastheniker, deswegen will ich dir nicht zu nah treten. Jedenfalls erschwert es den um Hilfe Gefragten bei der Suche nach Antworten und ist zudem auch unfreundlich diesengegenüber. Also beim nächsten Mal einfach ein bisschen auf deine Rechtschreibung achten.
Oh, das ist mir gar nicht aufgefallen 😳 Sonst meckert mein Rechner bei jedem Fehler.
Ich achte ab jetzt etwas mehr drauf 🙂
 

Zurück
Oben