2017-10-07 8 views
0

私はテイラー級数を使ってSin(x)の値を計算しようとしています:x-x^3/3!+ x^5/5! 私が試したのはこのコードですが、それは私にエラーを与えるものです! 1によってC sine(x)の誤差近似

jオフ

int n; 
int factorial; 
float sum=0; 
float angle; 
int sign=1; 
int i,j; 

printf("Please Enter angle in degrees:\n"); 
scanf("%f",&angle); 
angle=angle*3.14/180; 

printf("Please Enter Number of terms:\n"); 
scanf("%d",&n); 
for (i=1;i<=n;i++){ 
    factorial=1; 
    for (j=1;j<=(2*i-1);j++) 
    factorial=factorial*j; 
sum=sum+sign*(pow(angle,j)/factorial); 
sign*=-1; 
} 
printf("Sum up to %d terms is %f",n,sum); 
+0

は、Pythonを使うのですか? – chux

+0

あなたは本当にこのすべてを浮動小数点で実行する必要があります。好ましくは倍精度浮動小数点数です。特に、倍精度を期待する関数に整数引数を渡し、関数宣言の情報に基づいて引数をキャストするためにコンパイラに頼っています。データ型を明示的にする方がはるかに明確です。 –

答えて

1

// sum=sum+sign*(pow(angle,j)/factorial); 
sum=sum+sign*(pow(angle,j-1)/factorial); 

1大きすぎるここを使用しても実際の値パイ

#define MY_PI 3.1415926535897932384626433832795 
// angle=angle*3.14/180; 
angle *= MY_PI/180; 

のより良い近似を提案しませんdoubleを検討してください。コードがfloatのまま残したい場合は、powf(angle,j)のようなfloatの機能を使用してください - fに注意してください。


ヒント:毎回1から始まる項の階乗を再計算するのではなく、前の項から続行します。偶然

//psuedo code 
term = -x*x/(2i)/(2i+1)*previous_term 

double sum = 0.0; 
    double x2 = x_radians * x_radians; 
    double term = x_radians; 
    for (unsigned i = 1; i <= terms; i++) { 
    sum += term; 
    term *= -x2/((2 * i) * (2 * i + 1)); 
    } 
+0

それはかなりそれをカバーし、骨に残っている肉はありません。 –