2017-10-07 56 views
0

我想用taylor系列来计算Sin(x)的值,即:x-x^3/3!+ x^5/5! 我试过的是这段代码,但它给我错误!C正弦(x)的错误近似

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

你真的应该在浮点处理所有这些,最好是双精度。特别是,您将整型参数传递给期望为double的函数,并依靠编译器根据函数声明中的信息为您输入参数。使数据类型更加清晰明确。 –

回答

1

关1

j是1太大

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

推荐PI

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

没有实际价值的更好的近似这里使用float考虑double。如果代码想要保留float,然后使用float功能,如powf(angle,j) - 请注意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

这几乎涵盖了它,而不是任何遗留在骨头上的肉。 –