用加数之和计算余弦

时间:2017-04-14 17:43:21

标签: c

在我的作业中需要一些帮助。 他们给了我们一系列来计算余弦,这是: Σ(-1)^ ^ IX 2I /(2I)! 并且任务是通过编写一个取角x的函数在C程序中实现它,并计算它的余弦。该系列应该继续求和,直到该系列中的下一个加数小于1.0e-6(0.000001)。我这样做了,它只适用于小数字,如果我把大数字作为角度,程序就会卡住。

#include <stdio.h>
#include <math.h>
#define PI 3.141592

double my_cos(double angle);

int main() {
    double angle, radian,  my_res, their_res;

    printf("Please type a number... \n");
    scanf("%lf", &angle);

    radian = angle * (PI/180);


    my_res = my_cos(radian); /* result from my custom cosine function */
    their_res = cos(radian); /* result from the cos function located in the library math.h */

    printf("My result is: %f \nMath.h library result is: %f \n", my_res, their_res);

    return 0;
}

#include <math.h>
#define ACCURACY 1.0e-6

long factorial(int x);


double my_cos(double angle){
    int i = 0;
    double sum = 0,  next_addend;

    do {
        next_addend = pow(-1, (i+1)) * pow(angle, 2*(i+1)) / factorial(2*(i+1));
        sum += pow(-1, i) * pow(angle, 2*i) / factorial(2*i);

        i++;
    } while ( ACCURACY < fabs(next_addend) );

    return sum;
}

/* return the factorial of a given value */
long factorial(int x){
    if ( x == 0 ) {
        return 1;
    }

    return(x * factorial(x - 1));
}

如果我运行程序并插入45: enter image description here

但如果我插入300,该程序只是“等待”: enter image description here

我猜这与阶乘函数有某种关系? 我将非常感谢你的帮助..

1 个答案:

答案 0 :(得分:4)

根据系统上sizeof(long)是4还是8,您只能计算12!或20!在long内。此外,在每次迭代中计算多个pow效率非常低。

为了获得更好的解决方案,如果您知道之前的加数,请尝试找出如何计算next_addend(提示:在一张纸上计算它们的比率)。