我正在尝试使用泰勒系列制作一个计算cos(x)函数的程序到目前为止我已经得到了这个:
int factorial(int a){
if(a < 0)
return 0;
else if(a==0 || a==1)
return 1;
else
return a*(factorial(a-1));
}
double Tserie(float angle, int repetitions){
double series = 0.0;
float i;
for(i = 0.0; i < repeticiones; i++){
series += (pow(-1, i) * pow(angle, 2*i))/factorial(2*i);
printf("%f\n", (pow(-1, i) * pow(angle, 2*i))/factorial(2*i));
}
return series;
}
对于我的例子,我使用angle = 90,重复= 20,来计算cos(90),但它没用,我只是让值接近无限值,任何帮助都将非常感激。
答案 0 :(得分:3)
首先,角度是弧度,因此对于90度角,你需要通过M_PI/2
。
此外,你应该避免像阶乘一样微不足道的递归函数,它需要花费1/4的努力来迭代地编写它并且它会表现得更好。您实际上甚至不需要它,您可以将阶乘保留在临时变量中,并在每一步将其乘以2*i*(2*i-1)
。请记住,在此步骤中,您将很快达到可表示性/精确度墙。
你也不需要实际调用pow
-1来获得i
的力量,简单的i%2?1:-1
就足够了。这样,它会更快,并且在您增加i
时不会失去精确度。
哦,不要让i
float
,它是一个整数,使它成为一个整数。你的精确度很高,为什么会让它变得更糟......
最重要的是,你在{0}附近接近cos
,但正在为pi/2
调用它。这样做你会得到很高的错误。
答案 1 :(得分:0)
泰勒级数用于数学余弦函数,其参数以弧度为单位。所以90可能并不意味着你在这里的意思。
此外,该系列需要更多的术语,参数从0开始的时间越长。一般来说,在您开始看到连续的术语变得更小之前,术语的数量需要与参数的大小相当,并且还要超过那是为了获得收敛。对于x = 90,可用的术语很少。
另一个问题是您将阶乘计算为int
。阶乘函数增长非常快 - 已经为13!一个普通的C int
(在32位机器上)会溢出,所以你的条件超过第六个将完全错误。
事实上,90的阶乘和幂很快变得太大而不能表示为double
。如果您希望有机会看到系列会聚,则不得从头开始计算每个术语,而是使用公式(例如
nextTerm = - prevTerm * x * x / (2*i-1) / (2*i);