在我的作业中需要一些帮助。 他们给了我们一系列来计算余弦,这是: Σ(-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));
}
我猜这与阶乘函数有某种关系? 我将非常感谢你的帮助..
答案 0 :(得分:4)
根据系统上sizeof(long)
是4还是8,您只能计算12!或20!在long
内。此外,在每次迭代中计算多个pow
效率非常低。
为了获得更好的解决方案,如果您知道之前的加数,请尝试找出如何计算next_addend
(提示:在一张纸上计算它们的比率)。