C/C++ Programmierung
Aufgabe 9
Für positive reelle Zahlen a kann  durch folgende Iteration nährungsweise
bestimmt werden (x0 = a/2):
 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