我的C任务之一是用C语言写一个arctan(x)
的近似值。我应该基于的方程是arctan(x)=\sum {k=0}^{\infty }(-1)^{k} \tfrac{x^{2k+1}}{2k+1}
另外,x仅定义为-1<=x<=1
。
这是我的代码。
#include <stdio.h>
#include <math.h>
double main(void) {
double x=1;
double k;
double sum;
double sum_old;
int count;
double pw(double y, double n) {
double i;
double number = 1;
for (i = 0; i < n; i++) {
number *= y;
}
return(number);
}
double fc (double y) {
double i;
double number = 1;
for (i = 1; i <= y; i++){
number *= i;
}
return(number);
}
if(x >= (-1) && x <= 1) {
for(k=0; sum!=sum_old; k++) {
sum_old = sum;
sum += pw((-1), k) * pw(x, (2*k) + 1)/((2*k) + 1);
count++;
printf("%d || %.17lf\n", count, sum);
}
printf("My result is: %.17lf\n",sum);
printf("atan(%f) is: %.17f\n", x, atan(x));
printf("My result minus atan(x) = %.17lf\n", sum - atan(x));
} else {
printf("x is not defined. Please choose an x in the intervall [-1, 1]\n");
}
return 0;
}
它似乎适用于每个值,但值
1
和-1
除外。如果x=1
,则输出以以下结尾:...
7207 || 0.78543285189457468
7208 || 0.78536
而输出应该看起来更像这样。在这种情况下,x = 0.5。
25 || 0.46364760900080587
26 || 0.46364760900080587
My result is: 0.46364760900080587
atan(0.500000) is: 0.46364760900080609
My result minus atan(x) atan(x) = -0.00000000000000022
如何改善代码,使其可以与
x=1
和x=-1
一起运行。提前致谢。
PS:我使用自己创建的
pw()
函数而不是pow()
,因为我想避免不使用pow()
的限制,因为我们的讲座中没有。PPS:对于如何改进代码的任何建议,我将不胜感激。
最佳答案
在每次迭代中,您都添加(-1)k•x2k + 1 /(2k + 1),并且在总和不变时停止。
如果使用理想算术(精确,无限精确的算术)计算得出该值,则对于永远为零的x,它永远不会停止,因为您总是在更改总和。当使用固定精度算术进行计算时,当项太小时以至于由于精度有限而不会改变总和时,它将停止。
当| x |小于1的任何数量,这很快出现,因为x2k + 1变得更小。当| x |是1时,该项就变成1 /(2k + 1),并且变小得非常慢。直到k约为253,总和才会停止变化。
您可能会考虑将停止条件更改为sum
与sum_old
相比没有太大变化,而不是根本没有更改。