Sinus mit der Taylorreihe in C/C++

Posted by Frank | Posted in C/C++, Programmierung, Studium | Posted on 06-05-2009-05-2008

0

Tja da ich mitlerweile schon die 3. Anfrage zu dem Problem hatte obwohl dies recht leicht ist aber auch schnell tricky werden kann, poste ich hier mal einen Beispielprogramm in C bzw C++ (wenn man die Typecasts entfernt gehts auch in Standart C)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include<stdio.h>
#include
<math.h>
 
int fak(int f)
{ 
 
    if(f<=0)
        return 1;
    else
        return (f * fak(f-1));
}
 
double mein_sin (double winkel_bogenmass, double summe = 0, int iteration = 0)
{
    // Taylorreihe: x - x^3/3! + x^5/5! + ... +(-1)^(n+1)*x^(2*n+1)/(2*n+1)!
    double term = (pow(winkel_bogenmass, (2 * iteration + 1) )/fak(2 * iteration + 1));
 
    if( fabs(term) >= 0.00001 )
        return mein_sin(winkel_bogenmass, (summe + pow(static_cast<double>(-1), iteration) * term), (iteration + 1));
    else
        return ( summe + pow(static_cast<double>(-1), iteration)*term);
}
 
int main ()
{
double winkel_grd, winkel_bog;
double berechnetersin, echtersin;
 
    // Merke input erfolgt im Gradmaß somit muss es ins Bogenmaß umgeformt werden mit der formel x = a/180 · p wobei x deinem Gradmass entspricht
    // Um das ganze für C Spezifisch umzuformen entweder die Konstate M_PI nutzen oder direkt angeben, sähe dann folgendermaßen aus
    // Wenn man M_PI benutzt kanns sein dass man das dem Compiler mittelein muss er solle doch bitte auch die Mathe Konstaten laden/einbinden
    // bogenmass = gradmass/180*3.1415926535;
    // bogenmass = gradmass/180*M_PI;
    // Die umrechnung in die andere richtung wäre dann
    // a = (x · 180)/pi sprich
    // gradmass = (bogenmass*180)/3.1415926535;
    // gradmass = (bogenmass*180)/M_PI;
    // Wie gesagt Variablen in diesem fall müssen als Bogenmaß übergeben werden sonst kommt nur Grütze raus!
    // In Anlehnung an den Taschenrechner
    // deg = gradmass
    // rad = bogenmass
    printf("Geben sie eine reelle Zahl ein\n");
    scanf("%lf", &winkel_grd);
 
    // Umrechnen in Bogenmaß
    winkel_bog = winkel_grd/180*3.1415926535;
 
    berechnetersin = mein_sin(winkel_bog);
    echtersin = sin(winkel_bog);
 
    printf("mein sinus: %lf, echter sinus:%lf", berechnetersin, echtersin);
 
return 0;
}
#include<stdio.h>
#include
<math.h>

int fak(int f)
{ 

	if(f<=0)
		return 1;
	else
		return (f * fak(f-1));
}

double mein_sin (double winkel_bogenmass, double summe = 0, int iteration = 0)
{
	// Taylorreihe: x - x^3/3! + x^5/5! + ... +(-1)^(n+1)*x^(2*n+1)/(2*n+1)!
	double term = (pow(winkel_bogenmass, (2 * iteration + 1) )/fak(2 * iteration + 1));

	if( fabs(term) >= 0.00001 )
		return mein_sin(winkel_bogenmass, (summe + pow(static_cast<double>(-1), iteration) * term), (iteration + 1));
	else
		return ( summe + pow(static_cast<double>(-1), iteration)*term);
}

int main ()
{
double winkel_grd, winkel_bog;
double berechnetersin, echtersin;

	// Merke input erfolgt im Gradmaß somit muss es ins Bogenmaß umgeformt werden mit der formel x = a/180 · p wobei x deinem Gradmass entspricht
	// Um das ganze für C Spezifisch umzuformen entweder die Konstate M_PI nutzen oder direkt angeben, sähe dann folgendermaßen aus
	// Wenn man M_PI benutzt kanns sein dass man das dem Compiler mittelein muss er solle doch bitte auch die Mathe Konstaten laden/einbinden
	// bogenmass = gradmass/180*3.1415926535;
	// bogenmass = gradmass/180*M_PI;
	// Die umrechnung in die andere richtung wäre dann
	// a = (x · 180)/pi sprich
	// gradmass = (bogenmass*180)/3.1415926535;
	// gradmass = (bogenmass*180)/M_PI;
	// Wie gesagt Variablen in diesem fall müssen als Bogenmaß übergeben werden sonst kommt nur Grütze raus!
	// In Anlehnung an den Taschenrechner
	// deg = gradmass
	// rad = bogenmass
	printf("Geben sie eine reelle Zahl ein\n");
	scanf("%lf", &winkel_grd);

	// Umrechnen in Bogenmaß
	winkel_bog = winkel_grd/180*3.1415926535;

	berechnetersin = mein_sin(winkel_bog);
	echtersin = sin(winkel_bog);

	printf("mein sinus: %lf, echter sinus:%lf", berechnetersin, echtersin);

return 0;
}

ich hoffe das hilf einigen weiter

MfG Frank

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • Add to favorites
  • Email
  • RSS