Quadratwurzelrechnung mittels Heron-Verfahren

lady_x

Mitglied
Hallo,
meine Aufgabe ist, Java so zu programmieren so dass bei Eingabe in die Konsole nach 100 Näherungsverfahren das Ergebnis herauskommt.
Genauer gesagt:
Programmieren Sie eine Klasse SquareRoot, die die Quadratwurzel eines von der Konsole eingelesenen double Wertes 𝑎 wie folgt berechnet. Sie beginnen mit der 0. Annäherung als Startwert 𝑥=1. 0𝑑. Die erste Annäherung erhalten Sie mit der Zuweisung𝑥𝑥=1/2 * (𝑥+𝑎/𝑥). Alle weiteren Annäherungen berechnen sich mit derselben Formel. Geben Sie die 100. Annäherung von √𝑎 auf der Konsole aus.

Meine Idee sieht folgendes aus:

Java:
import java.util.Scanner;
    //Zahl in der Konsole lesen
    //Startwert x = 1.0d (0. Annäherung)
    //weitere Annäherung - siehe Formel
    //Ziel: 100. Annäherung -> Ergebnis
    public class SquareRoot {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            double n = in.nextDouble();
            double b = n;
            double c = 1;
            double summe = 1;

            while (c <= 100) {
                 c = (b + 1)/2;
                 summe = 1/2 * (c + b/c);
                 c = c + summe;
                 c++;
            if ( c <= 101){
            break;
            }
                 System.out.println(c);
            }
            System.out.println(summe);
        }
    }

Ich bitte euch um Hilfe, da ich die Fehler nicht finde. Bitte beachte, nicht mit return sondern nur über Schleife rechnen lassen.
LG
 
Das wird dir bestimmt helfen:
Java:
import java.util.Scanner;

// Zahl in der Konsole lesen
// Startwert x = 1.0d (0. Annäherung)
// weitere Annäherung - siehe Formel
// Ziel: 100. Annäherung -> Ergebnis
public class SquareRoot {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("Bitte gebe die Zahl ein, deren Quadratwurzel mit 100 Schleifen-Durchläufen berechnet werden soll:");
        double a = new Scanner(System.in).nextDouble();
        /*
         * Die Näherung
         */
        double x = 1.0d;
        for (int i = 0; i < 10; i++) {
            x = 0.5 * (x + a / x);
            System.out.println("Die " + (i + 2) + ". Näherung lautet: " + x);
        }
        System.out.println("Die Wurzel aus 2 lautet: " + Math.sqrt(2));
    }

}
lg
 
Hallo,
meine Aufgabe ist, Java so zu programmieren so dass bei Eingabe in die Konsole nach 100 Näherungsverfahren das Ergebnis herauskommt.
Genauer gesagt:
Programmieren Sie eine Klasse SquareRoot, die die Quadratwurzel eines von der Konsole eingelesenen double Wertes 𝑎 wie folgt berechnet. Sie beginnen mit der 0. Annäherung als Startwert 𝑥=1. 0𝑑. Die erste Annäherung erhalten Sie mit der Zuweisung𝑥𝑥=1/2 * (𝑥+𝑎/𝑥). Alle weiteren Annäherungen berechnen sich mit derselben Formel. Geben Sie die 100. Annäherung von √𝑎 auf der Konsole aus.

Meine Idee sieht folgendes aus:

Java:
import java.util.Scanner;
    //Zahl in der Konsole lesen
    //Startwert x = 1.0d (0. Annäherung)
    //weitere Annäherung - siehe Formel
    //Ziel: 100. Annäherung -> Ergebnis
    public class SquareRoot {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            double n = in.nextDouble();
            double b = n;
            double c = 1;
            double summe = 1;

            while (c <= 100) {
                 c = (b + 1)/2;
                 summe = 1/2 * (c + b/c);
                 c = c + summe;
                 c++;
            if ( c <= 101){
            break;
            }
                 System.out.println(c);
            }
            System.out.println(summe);
        }
    }

Ich bitte euch um Hilfe, da ich die Fehler nicht finde. Bitte beachte, nicht mit return sondern nur über Schleife rechnen lassen.
LG
Punkt eins: Benne die Variablen vernünftig. So ist es extrem schwer zu lesen. Es gibt n,b und c - was macht was?

Die break Anweisung sieht falsch aus - wenn c <= 100 ist, springst du aus der while schleife raus. Der ganze if-block kann weg
 
LimDul hat es schön erklärt, die vielen, nicht alle benötigte Variablen wirken etwas holprig!
 
Hier versteckt sich ein Fehler:
Java:
summe = 1/2 * (c + b/c);

1/2 ist eine Division zweier Ganzzahlen und wird daher ein ganzzahliges Ergebnis liefern, nämlich 0.
 
Ja ich hoffe, die TE weiß, dass 1 geteilt durch 2 0,5 ergibt. 😉 Java rechnet bei 1 / 2 allerdings mit Ganzzahlen ohne Rest!

Also
  1. zu viele Variablen
  2. eine überflüssige Schleifen Abbruch Bedingung
  3. Scanner wiederverwendet!
  4. schlechte Variablenbezeichner
  5. Kommentare an falscher Stelle
  6. keine Eingabemeldung an den Benutzer
 
+ das Verfahren konvergiert eigentlich so schnell, dass es nach 10 Durchläufen meist keine Änderung mehr gibt....
 

Zurück
Oben