如何使用C中的递归计算x值的正弦级数(Taylor)?
(C) 计算级数 y=x-x3/3!+x5/5!-x7/7!+ 停止标准是什么 |xi/i!|1){ 返回x*事实(x-1); } 否则{ 返回1; } } int main(){ 整数x,i=1,符号=1; 浮动结果; scanf(“%d”和&x); 而(abs(pow(x,i)/fact(i))>0.001){ 结果+=符号*(pow(x,i)/事实(i)); i+2; 符号=符号*-1; } printf(“结果=%f\n”,结果); 返回0; } 问题是如何使用C中的递归计算x值的正弦级数(Taylor)?,c,C,(C) 计算级数 y=x-x3/3!+x5/5!-x7/7!+ 停止标准是什么 |xi/i!|1){ 返回x*事实(x-1); } 否则{ 返回1; } } int main(){ 整数x,i=1,符号=1; 浮动结果; scanf(“%d”和&x); 而(abs(pow(x,i)/fact(i))>0.001){ 结果+=符号*(pow(x,i)/事实(i)); i+2; 符号=符号*-1; } printf(“结果=%f\n”,结果); 返回0; } 问题是 当我输入90。。。输出应该是1
当我输入90。。。输出应该是1。。。(就像罪(x)) 我得到一个不同的输出代码(至少)未初始化
结果
改变
float result;
到
也 是NOP(无操作)。结果一事无成。它将
2
添加到i
中,并且不将结果分配给任何东西,“贯穿”结果
要通过2
增加i
,请执行以下操作:
i = i + 2;
或
另外,^2使用
abs()
将不起作用,因为它返回int
使用fabs()
获取浮点值
或者干脆不使用它,因为它的论点在这里永远不会是否定的
最后一条建议是,由于
浮点
的准确度有限,您更喜欢使用双精度
而不是浮点
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
由于巨大的取消错误,此公式不适用于较大的参数值。我自己的实现为90
提供了-1.07524337969e+21
如果你用
90-14*2*Pi
来计算,你会得到0.893995…
,这不是一个很坏的结果。问题很明显。在执行循环之前,必须将度转换为弧度。您的代码还存在一些其他问题
以下是已更正的代码,它为您提供了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 ;
}
#包括
#包括
整数事实(整数x){
如果(x>1){
返回x*事实(x-1);
}
否则{
返回1;
}
}
int main(){
整数x,i=1,符号=1;
双结果,rad;
scanf(“%d”和&x);
rad=x/180.0*3.1415;
而((pow(x,i)/fact(i))>0.001){
结果+=符号*(功率(rad,i)/事实(i));
i+=2;
符号*=-1;
}
printf(“结果=%f\n”,结果);
返回0;
}
使用以下幂级数计算sin(x)的算法:sin(x)=(x/1!)-(x^3/3)+(x^5/5!)-(!^x 7/7)+。。。当给定和的两个连续项之间的差值小于某个公差时,我们停止计算。有什么问题?问题是什么?当我输入90。。。输出应该是1。。。(这就像罪(x)),问题出在哪里?i+2代码>什么也不做。也许你想做i+=2代码>?不能输入90。泰勒展开式将弧度作为x
。为什么浮点结果中的点=0代码>?为了完整性,我用浮点文本初始化了一个浮点@因为这是一个很好的实践,我甚至会这样做float result=0.f代码>@Mhmoudko:不是。仅当声明为静态
或定义为gloably时,才会对其进行初始化。。或者运气不好。@Mhmoudko很抱歉,如果您声明它是静态浮点结果,那么您就完全错了代码>这将是不同的。但是默认情况下没有零,在c中,如果一个变量没有初始化,它的值是未定义的,使用它显然会导致未定义的行为。我得到的输出很奇怪。它是49086088.000000,我想修正它:D非常感谢你:D,问题解决了当你有上一个时,你为什么要计算下一个幂和阶乘Un=-U(n-1)*x*x/(n*2*(n*2+1)
-你需要仔细检查一下。实际上我们必须使用而((pow(rad,i)/fact(i))>0.001)
但是它给出了0.999…为什么你删除了fabs()?…sinx的公式说我们必须使用fabs(pow(rad,i)/fact(i)),是的,你是正确的。我们需要fabs()
,我忽略了它,因为在运行程序时它似乎不是必需的;它也会导致不正确的工作。其不正确工作的原因在于浮点数的比较问题。请参阅本文:
i += 2;
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
#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 ;
}