(C)计算系列
y = x - x 3 / 3! + x 5 / 5! - x 7 / 7! + .....
停止标准是
| x i / i! | < = 0.001
我尝试过:
#include<stdio.h>
#include<math.h>
int fact(int x){
if(x>1){
return x * fact(x-1);
}
else {
return 1 ;
}
}
int main () {
int x , i=1 , sign=1 ;
float result ;
scanf("%d",&x);
while(abs(pow(x,i)/fact(i))>0.001){
result += sign*(pow(x,i)/fact(i));
i+2;
sign = sign * -1 ;
}
printf("result= %f\n",result);
return 0 ;
}
问题是
当我输入90 ...输出应该是1 ...(它就像sin(x))
我得到一个不同的输出
答案 0 :(得分:2)
代码(至少)未能初始化result
。
更改
float result;
到
float result = 0.f;
另外
i+2;
是NOP(无操作)。它没有任何结果。它会将2
添加到i
,并且不会将结果分配给任何内容,&#34;通过远离&#34;结果。
要i
增加2
,请执行:
i = i + 2;
或
i += 2;
同样^ 2使用abs()
在返回int
时无法正常工作。
使用fabs()
获取浮点值。
或者根本就不要使用它,因为它的论点永远不会消极。
最后的建议更倾向于使用double
而不是float
,因为float
的准确性有限。
答案 1 :(得分:0)
sin(90)=0.89399666360055789051826949840421...
除了单位混淆之外,你的代码效率不高,因为当你存在一个很好的重现时,你会从每个术语的头开始计算权力和因子。
Sin= x
Term= x
Factor= -x*x
i= 2
while |Term| > 0.001:
Term*= Factor / (i * (i+1))
Sin+= Term
i+= 2
由于巨大的取消错误,此公式不适用于参数的大值。我自己的实现为-1.07524337969e+21
提供了90
。
如果您为90-14*2*Pi
计算它,则会得到0.893995...
,而不是那么糟糕的结果。
答案 2 :(得分:0)
问题非常明显。在执行循环之前,您必须将度数转换为弧度。您的代码也有其他一些问题。
以下是经过纠正的代码,它为您提供1代表90:
#include<stdio.h>
#include<math.h>
int fact(int x){
if(x>1){
return x * fact(x-1);
}
else {
return 1 ;
}
}
int main () {
int x , i=1 , sign=1;
double result, rad;
scanf("%d",&x);
rad = x/180.0*3.1415;
while((pow(x,i)/fact(i))>0.001){
result += sign*(pow(rad,i)/fact(i));
i+=2;
sign *= -1 ;
}
printf("result= %f\n",result);
return 0 ;
}
答案 3 :(得分:0)
使用以下幂级数计算sin(x)的算法:sin(x)=(x / 1!) - (X ^ 3/3)+(x ^ 5/5!) - (!^ x 7/7)+ ...当给定总和的两个连续项之间的差异小于某个容差时,我们停止计算。