Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C中的递归计算x值的正弦级数(Taylor)?_C - Fatal编程技术网

如何使用C中的递归计算x值的正弦级数(Taylor)?

如何使用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

(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。。。(就像罪(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 ;
}