// Programm: newton.C
// Berechnet Quadratwurzelm mittels Newton-Iteration.
#include
int main()
{
// Eingabe
std::cout << "Berechnung der Quadratwurzel von n,"
<< " n > 0. Eingabe n :? ";
double n;
std::cin >> n;
// Newton-Iteration: x_{i+1} = 1/2 (x_i + n/x_i)
// Um sicherzustellen, dass der Algorithmus terminiert,
// halten wir eine untere Schranke fuer den aktuellen
// Approximationswert aufrecht. Diese Schranke wird
// hochgesetzt, wann immer der folgende Wert groesser
// wird als der aktuelle. Auf diese Weise wird ein
// etwaiger Zyklus erkannt und abgebrochen.
double curr = n; // aktueller Wert
double prev = 0; // voriger Wert
double lb = 0; // untere Schranke
unsigned int counter = 0; // Anzahl Iterationen
do {
++counter;
if (curr > prev)
lb = prev;
prev = curr;
curr = (prev + n / prev) / 2;
} while (curr != prev && curr > lb);
// Ausgabe
std::cout << "Approximation der Quadratwurzel aus "
<< n << " ist: " << curr
<< "\nApproximationsfehler des Quadrats ist "
<< curr * curr - n << "."
<< "\nAnzahl der Iterationen war "
<< counter << "." << std::endl;
}