#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! */