C :: Aufgabe #188
1 Lösung

Babylonisches Wurzelziehen / Heron-Verfahren / Heronsches Näherungsverfahren
Anfänger - C
von Exception
- 03.06.2018 um 08:27 Uhr
Die zu schreibende Anwendung soll eine positive Zahl entgegennehmen und durch das Heron-Verfahren näherungsweise die Quadratwurzel berechnen.
Zusatz:
Es werden die einzelnen Schritte ausgegeben, siehe Beispiel.
Beispiel: mit Wurzel aus 12
~ Viel Spaß :)
Zusatz:
Es werden die einzelnen Schritte ausgegeben, siehe Beispiel.
Beispiel: mit Wurzel aus 12
...
Die Wurzel aus 12 ist zwischen 3.5 und 3.4
...
Die Wurzel aus 12 ist zwischen 3.45 und 3.46
...
~ Viel Spaß :)
Lösungen:

/*** +----------------------+ | | | Programm: Heron.c | | | +----------------------+ written 04.03.2021 by BSpinoza aka Bruno Schäfer, Losheim am See, Germany * * ************************************************************************************************************ * Bei der Heron-Methode zur Wurzelberechnung (Babylonisches Wurzelziehen), das dem griechischen Mathematiker * Heron von Alexandria zugeschrieben wird, handelt es sich um ein Verfahren zur Approximation von * Quadratwurzeln, das folgendermaßen funktioniert: * * Falls sqrt(a) = b, dann ist b^2 = a und es gilt: * a/b = a / sqrt(a) = sqrt(a), da (a/b)^2 = a^2 / b^2 = a^2 / a = a. * b = sqrt(a) => a/ b = sqrt(a); b < sqrt(a) => a/b > sqrt(a); b > sqrt(a) => a/b > sqrt(a) * Der Mittelwert aus b und a/b liegt viel näher an sqrt(a) als b und a/b selbst. * Die mehrmalige Durchführung dieser besseren Näherung führt dann in wenigen Schritten * zu dem exakten Wert der Quadratwurzel. * Zum Vergleich berechnet das Programm die Quadratwurzel mittels der C-Funktion sqrt(). * ****************************************************************************************************************/ #include <stdio.h> #include <math.h> int main() { double a, b, z, t; int i; printf("/nHenon-Verfahren (Babylonisches Wurzelziehen)\n\n"); printf("Zahl eingeben: "); scanf("%lf", &a); b = a / 2.0; /* Startwert */ printf("\nStartwert: %f (= Naeherungswert Nr. 0)\n", b); for(i = 1; i <= 50; i++) { t = a / b; z = (b + t) / 2.0; if (fabs(z-b) < 0.00000000001) /* Abbruchbedingung der for-Schleife */ break; b = z; printf("Naeherungswert Nr. %i: \t%.9lf\n", i, b); } printf("\nBerechnung mit math. Funktion: \nsqrt(%lf) =\t%.9lf\n", a, sqrt(a)); return 0; }