Lösung der Aufgaben 1.9 und 1.11

Das Programm echochx1 arbeitet nicht für alle sinnvollen Eingaben korrekt. Die Lösung ist deshalb nicht gut, weil sowohl der Zähler als auch der Nenner rasch große Zahlenwerte annimmt. Der Nenner ist als int-Wert definiert. Wenn int-Werte eine gewissen Maximalwert überschreiten (32 767 für 16 Bit-Systeme: ca. 2 Milliarden bei 32-Bit-Systemen) werden die Werte negativ. Dies wird im Kapitel 2 des Buches behandelt. Eine bessere Lösung ist, Zähler und Nenner nicht getrennt zu berechnen, sondern immer den ganzen Summanden heranzuziehen. Durch abwechselndes Multiplizieren und Dividieren kann man die Zwischenresultate mit große Zahlenwerte vermeiden. Diese Methode wird auch in der Lösung der Aufgabe 1-11 verwendet.

/* ehochx2.c

   berechnet die Exponentialfunktion  e^x nach der
   Taylorreihenentwicklung 
*/


#include <stdio.h>

int main(void)
{
  double x;  /* Exponent                      */
  double g;  /* Genauigkeit                   */
  double si; /* die einzelnen Summanden       */
  double s;  /* Summe, ist gleich Resultat    */
  int i;     /* Nummer des aktuellen  mmanden */

  printf("Berechnung von e^x \n\n");
  printf("x = "); scanf("%lf",&x);
  printf("Genauigkeit g = ");
  scanf("%lf", &g);
  printf("  i     Summand      Summe \n");
  printf("----------------------------\n");

  s = 1.0; i = 0; si = 1.0;
  do {
    i++;
    si = si/i*x;
    s = s + si;
    printf("%3d %12.8f %12.8f\n",i, si, s);
  } while (si > g);

  return 0;

} /* end main */


/* sinus2.c
   berechnet die Sinusfunktion sin(x) nach der Taylorreihenentwicklung */

#include <stdio.h>

int main(void)
{
  double x;  /* Argument                      */
  double g;  /* Genauigkeit                   */
  double si; /* die einzelnen Summanden       */
  double s;  /* Summe, ist gleich Resultat    */
  int i;     /* 1,3,5,7,9                     */

  printf("Berechnung von sin(x)\n\n");
  printf("x = "); scanf("%lf",&x);
  printf("Genauigkeit g = ");
  scanf("%lf", &g);
  printf("  i     Summand         Summe  \n");
  printf("--------------------------------\n");

  s = x; i = 1; si = x;
  do {
    i = i + 2;                   /* erzeugt 3,5,7,9,...  */
    si = -si/(i-1)*x/i*x;
    s = s + si;
    printf("%3d %+10.8f %10.8f\n", i, si, s);
  } while (si*si > g*g);     /* weil si jedes 2-te mal negativ ist */

  return 0;

} /* end main */