-3

给定一个数字 x。您需要计算 e^x 的泰勒级数之和。

e^x = 1 + x + x^2/2!+ x^3/3!+ ...

计算总和,直到一般数字小于或等于 10^(-9)。

下面是我的解决方案,但 x<0 数字是错误的。您是否知道如何解决此问题以适用于负数。

    int x,i,n;
    long long fact; //fact needs to be double
    double sum=0,k=1;
    scanf("%d",&x);
            i=0; sum=0; k=1;
                while (fabs(k)>=1.0E-9) {
                    fact=1;
                    for (int j=1;j<=i;++j)
                        fact*=j;
                    k=pow(x,i)/fact;
                    sum+=k;
                    ++i;
                }
    printf("%lf\n",sum);
4

3 回答 3

0

事实需要加倍,不能长长因为有分歧。

于 2015-10-25T20:39:30.660 回答
0

您不应该使用该pow函数将(可能是负数)数提高到整数幂。而是像计算阶乘一样使用重复乘法。

另请注意,您可以存储 $n!$ 和 $x^k$ 的最后计算值,以通过单次乘法获得 $(n+1)!$ 和 $x^{k+1}$。

于 2015-10-25T19:48:27.860 回答
0

您的问题是您的阶乘计算溢出并成为垃圾。之后,您的ith任期不再减少并产生完全错误的结果。

20 次迭代后,64 位数字不能包含 的值20!。见:http ://www.wolframalpha.com/input/?i=21%21%2F2%5E64

如果x^n/n!不低于您的阈值 ( 1e-9),n=20那么您的计算n!即使是 64 位整数也会溢出。发生这种情况时,您将获得n!模的值2^63(我简化是因为您没有使用无符号整数,而是会获得随机负值,但原理仍然存在)。这些值可能非常低而不是非常高。这将导致你x^n/n!变得更大而不是更小。

于 2015-10-25T19:51:56.420 回答