C/C++ Programmierung

Aufgabe 9

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