我的C任务之一是用C语言写一个arctan(x)的近似值。我应该基于的方程是

arctan(x)=\sum {k=0}^{\infty }(-1)^{k} \tfrac{x^{2k+1}}{2k+1}

c - 我应该更改什么才能使我的arctan(x)近似值正确显示x = 1和x = -1?-LMLPHP

另外,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=1x=-1一起运行。

提前致谢。

PS:我使用自己创建的pw()函数而不是pow(),因为我想避免不使用pow()的限制,因为我们的讲座中没有。

PPS:对于如何改进代码的任何建议,我将不胜感激。

最佳答案

在每次迭代中,您都添加(-1)k•x2k + 1 /(2k + 1),并且在总和不变时停止。

如果使用理想算术(精确,无限精确的算术)计算得出该值,则对于永远为零的x,它永远不会停止,因为您总是在更改总和。当使用固定精度算术进行计算时,当项太小时以至于由于精度有限而不会改变总和时,它将停止。

当| x |小于1的任何数量,这很快出现,因为x2k + 1变得更小。当| x |是1时,该项就变成1 /(2k + 1),并且变小得非常慢。直到k约为253,总和才会停止变化。

您可能会考虑将停止条件更改为sumsum_old相比没有太大变化,而不是根本没有更改。

10-07 12:40