C/C++ Programmierung
Aufgabe 9
Für positive reelle Zahlen a kann
durch folgende Iteration nährungsweise
bestimmt werden (x0 = a/2):
- Schreiben Sie eine Funktion MySqrt, die die Quadratwurzel von a nährungsweise mittels obiger Iteration
berechnet.
Die Iteration ist abzubrechen, falls

ist, spätestens aber nach 10 Iterationen.
Die Parameter von MySqrt seien a und E.
- Berechnen Sie folgende Werte

für E = 1.0*10-15 und vergleichen Sie die Ergebnisse mit denen der Standardfunktion sqrt(x).
- Wie ist der Unterschied zwischen den Ergebnissen Ihrer Funktion und den Ergebnissen von sqrt(x)
(dazu ist der Befehl #include math.h nötig) zu erklären?
Welche Abhilfe ist möglich?
Hinweis: |x| wird mit fabs(z) berechnet, es ist der Datentyp double zu verwenden.
Lösung für die Aufgabe
#include <math.h>
#include <stdio.h>
#define MAX_ITERATIONEN 10 /* maximale Anzahl der Iterationen */
double MySqrt(double a, double E) /* eigene Funktion für die Berechnung der Quadratwurzel */
{
double x, x2;
int k;
x = a / 2; /* Startwert für x berechnen */
for(k=0;k<MAX_ITERATIONEN;k++) /* Schleife - Iterationen */
{
x2 = (x + a / x) / 2; /* neuen x-Wert berechnen und in x2 schreiben */
if (fabs(x2 - x) <= (E * x))
k = MAX_ITERATIONEN; /* k=MAX_ITERATIONEN => Schleife abbrechen */
else
x = x2; /* neuen berechneten x-Wert in x schreiben */
}
return(x);
}
int main(void) /* hier beginnt das Hauptprogramm */
{
double zahl;
do
{
do
{
/* hier wird nach einer Zahl gefragt */
printf("\nBitte eine positive Zahl eingeben: ");
scanf("%lf", &zahl);
/* testen ob eine negative Zahl eingegeben wurde */
if (zahl <= 0)
printf("Negative Zahlen sind nicht zulaessig!\n");
}
while (zahl < 0); /* Zahl<0, dann Zahl noch einmal eingeben */
if (zahl == 0) /* ist zahl = 0 dann folgende Routine */
printf("Quadratwurzel von 0 ist 0.\n");
else /* ist zahl > 0 dann folgende Routine */
{
/* Quadratwurzel ausgeben / berechnet mit MySqrt() und sqrt() */
printf(" Quadratwurzel berechnet mit eigener Funktion = %lf\n", MySqrt(zahl, 1.e-15));
printf("Quadratwurzel berechnet mit der Funktion sqrt() = %lf\n", sqrt(zahl));
}
/* Fragen, ob noch eine Quadratwurzel berechnet werden soll */
printf("Soll eine weitere Quadratwurzel berechnet werden (Ja)? ");
}
while (getch() == 'j'); /* "j" eingegeben, dann noch eine Zahl */
printf("\n");
return(0); /* Das Hauptprogramm gibt am Ende 0 zurueck, da kein Fehler aufgetreten ist. */
}
/*
** Wurzel von 1/4 = 0.5 / bei sqrt() = 0.5
** Wurzel von 16 = 4 / bei sqrt() = 4
** Wurzel von 400² = 400.028569 / bei sqrt() = 400
** Wurzel von 1234² = 1326.640165 / bei sqrt() = 1234
**
** Die Ergebnisse von den Funktionen MySqrt() und sqrt() sind unterschiedlich.
** Je größer die Zahlen werden, desto größer wird die Differenz der
** Ergebnisse von den beiden Funktionen.
** Dies kann jedoch verhindert werden, in dem man die Anzahl der Iterationen
** erhöht!
*/
Zurück zur Übersicht