Quadratwurzel berechnen

mato37

Mitglied
[CODE lang="java" title="SqrtAprox"]package sqrtAp;

public class sqrtAp {

public static void main(String[] args) {
double a = 25;
double x = a / 2;

for (int i = 0; i < 5; i++) {
x = (x + (a / x)) / 2;
System.out.println(x);
}
}
}[/CODE]

Moin,

oben angezeigter Code gefällt mir eigentlich ganz gut,
jedoch würde ich noch gerne eine Abbruchbedingung einbringen.
Die Lautet wie folgt:

Die Methode soll iterieren, bis zwei aufeinanderfolgende Loesungsvorschlaege sich um weniger als 0.0001 unterscheiden.

ich bedanke mich fuer euer feedback

VG Malte

ps: ist auch keine bewertete Aufgabe
 
Die Methode soll iterieren, bis zwei aufeinanderfolgende Loesungsvorschlaege sich um weniger als 0.0001 unterscheiden.
ich bedanke mich fuer euer feedback
Du hast unser (zumindest mein) Einverständnis, das auch zu tun/realisieren/implementieren. 🙂

Wenn du ein Problem hast, bzw. irgendwo nicht weiterkommst, solltest du auch sagen, wo genau du ein Problem hast, bzw. wo du nicht weiterkommst und was du bereits probiert hast.
 
Naja, wie berechnet man denn die (absolute) Differenz von zwei Werten? Und wie vergleicht man, ob diese berechnete Differenz kleiner als eine gegebene Konstante ist?
 
Mein letzter Versuch:
Java:
package sqrtAp;

public class sqrtAp {

    public static void main(String[] args) {
        double a = 25;
        double x = a / 2;
        double xa = x;
        double d;

        for (int i = 0; d <= 0.0001; i++) {
            x = (x + (a / x)) / 2;
            System.out.println(x);
            x - xa = d;
        }
    }
}
 
Java:
x - xa = d;
Variablen, denen ein Wert zugewiesen werden soll, müssen nach wie vor (wie auch bei der Zuweisung von 'x' weiter oben bei dir) auf der linken Seite des Gleichheitszeichens stehen. Das Gleichheitszeichen ist quasi kein "mathematisches Gleichsetzen" zweier Ausdrücke, sondern eine Zuweisung/Schreiben der Variablen auf der linken Seite.
 
Habe es mit ein bisschen ausprobieren hinbekommen.

Java:
package sqrtAp;

public class sqrtAp {

    public static void main(String[] args) {
        double a = 36;
        double x = a / 2;
        double xn;
        double d;


        for (int i = 0; i<= 15 ; i++) {
            xn = (x + (a / x)) / 2;
            System.out.println(x);
            d = x - xn;
            System.out.println("d: " + d);
            x = xn;
            System.out.println(x);
            if(d<=0.0001)
                break;
        }
    }
}
 
Das ist erst einmal super!

Einfach noch zwei kleine Ideen für Dich:

Benötigst Du den Zähler i? Und den Abbruch nach 16 Durchläufen?
(Sprich: War das eine zusätzliche Abbruchbedingung oder soll das die einzige Abbruchbedingung sein?)
Wenn Du das nicht brauchst, dann könnte man das mit der Zählschleife (for) ja weglassen und statt dessen eine do while Schleife nutzen:

Java:
        do {
            xn = (x + (a / x)) / 2;
            System.out.println(x);
            d = x - xn;
            System.out.println("d: " + d);
            x = xn;
            System.out.println(x);
        } while (d > 0.0001)



Oder:
Falls du den Abbruch nach 16 Durchläufen brauchst, dann könnte man d auf einen höheren Wert setzen und das noch mit in die Bedingung nehmen:

Java:
        double d=1.0;

        for (int i = 0; i<= 15 && d > 0.0001 ; i++) {
            xn = (x + (a / x)) / 2;
            System.out.println(x);
            d = x - xn;
            System.out.println("d: " + d);
            x = xn;
            System.out.println(x);
        }
    }

Man kann aber geteilter Meinung sein, ob dies gegenüber Deiner Variante zu bevorzugen ist. Ich selbst bin kein Freund davon, die typische Zählschleife mit irgend was anderem zu verwenden...
 

Zurück
Oben