C-Programmierung

Einsatz Von Funktionszeigern

Funktionszeiger | | Callbacks

Einsatzbeispiel von Funktionszeigern:

Summe über rationale Zahlen $\displaystyle{ \sum_{i=a}^{b} t_i, t_i=\frac{n_i}{d_i} }$

Leibniz-Reihe zur Berechnung von $\frac{\pi}{4}$:

$ \frac{\pi}{4} = 1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + ... $
$ t_i = (-1)^i \frac{1}{2i+1} $

Euler-Reihe zur Berechnung von $e$:

$ e = 1 + \frac{1}{2!} + \frac{1}{3!} + \frac{1}{4!} + ... $
$ t_i = \frac{1}{i!} $
$ n_i=1
$ d_{i+1} = d_i\cdot i, d_1=1 $

Summenfunktion mit variabler Termfunktion:

void sum(int a, int b, double x,
         double (*term)(int i, double x, double *numerator, double *denominator))
{
   double s;
   double n,d;

   for (s=0.0,n=d=1.0,int i=a; i<=b; i++)
   {
      (*term)(i, x, &n, &d);
      s+=n/d;
   }

   return(s);
}

Damit ergibt sich die Berechnung von $\pi$ bzw. $e$ aus ein und derselben Summenfunktion mit verschiedenen Termfunktionen:

double leibniz_term(int i, double x, double *numerator, double *denominator)
{
   *numerator = i&1?-1.0:1.0;
   *denominator = 2*i+1;
}

double pi_sum(int n)
{
   return(4*(1+sum(1, n, 0.0, leibniz_term)));
}
double euler_term(int i, double x, double *numerator, double *denominator)
{
   *denominator*=i;
}

double euler_sum(int n)
{
   return(sum(1, n, 0.0, euler_term));
}

Q Wie lautet die Darstellung der Exponentialfunktion $e^x$ als Potenzreihe (Taylorreihe) mit Hilfe obiger Summenfunktion?

Potenz-Reihe:

$ e^x = 1 + \frac{x}{1!} + \frac{x^2}{2!} + \frac{x^3}{3!} + ... $
double exp_term(int i, double x, double *numerator, double *denominator)
{
   *nominator*=x;
   *denominator*=i;
}

double exp_sum(double x, int n)
{
   return(sum(1, n, x, exp_term));
}


Funktionszeiger | | Callbacks

Options: