如何使用C中的递归来评估正弦函数(泰勒)的x值?

时间:2015-03-07 10:52:27

标签: c

(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)) 我得到一个不同的输出

4 个答案:

答案 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)+ ...当给定总和的两个连续项之间的差异小于某个容差时,我们停止计算。