C-Programmierung
Einsatz Von Funktionszeigern
← Funktionszeiger | ● | Callbacks →
Einsatzbeispiel von Funktionszeigern:
Summe über rationale Zahlen b∑i=ati,ti=nidi
Leibniz-Reihe zur Berechnung von π4:
π4=1−13+15−17+...
ti=(−1)i12i+1
Euler-Reihe zur Berechnung von e:
e=1+12!+13!+14!+...
ti=1i!
$ n_i=1
di+1=di⋅i,d1=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);
}
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 π 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)));
}
{
*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));
}
{
*denominator*=i;
}
double euler_sum(int n)
{
return(sum(1, n, 0.0, euler_term));
}
Q Wie lautet die Darstellung der Exponentialfunktion ex als Potenzreihe (Taylorreihe) mit Hilfe obiger Summenfunktion?
Potenz-Reihe:
ex=1+x1!+x22!+x33!+...
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));
}
{
*nominator*=x;
*denominator*=i;
}
double exp_sum(double x, int n)
{
return(sum(1, n, x, exp_term));
}
← Funktionszeiger | ● | Callbacks →