函数 e^x 的泰勒级数
Taylor series of function e^x
给定一个数字 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);
您不应使用 pow
函数将(可能为负的)数计算为整数次方。而是像计算阶乘一样使用重复乘法。
另请注意,您可以存储 $n!$ 和 $x^k$ 的最后计算值,以通过一次乘法获得 $(n+1)!$ 和 $x^{k+1}$ .
你的问题是你的阶乘计算溢出并变成了垃圾。
之后,您的 ith
项不再减少并产生完全错误的结果。
经过 20 次迭代后,64 位数字不能包含 20!
的值。参见:http://www.wolframalpha.com/input/?i=21%21%2F2%5E64
如果 x^n/n!
在 n=20
时不低于您的阈值 (1e-9
),那么您对 n!
的计算甚至会溢出 64 位整数。当发生这种情况时,您将获得 n!
模 2^63
的值(我进行了简化,因为您没有使用无符号整数,您将获得随机负值,但原理仍然存在)。这些值可能非常低而不是非常高。这将导致您的 x^n/n!
变得更大而不是更小。
fact需要double,不能long long因为divide。
给定一个数字 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);
您不应使用 pow
函数将(可能为负的)数计算为整数次方。而是像计算阶乘一样使用重复乘法。
另请注意,您可以存储 $n!$ 和 $x^k$ 的最后计算值,以通过一次乘法获得 $(n+1)!$ 和 $x^{k+1}$ .
你的问题是你的阶乘计算溢出并变成了垃圾。
之后,您的 ith
项不再减少并产生完全错误的结果。
经过 20 次迭代后,64 位数字不能包含 20!
的值。参见:http://www.wolframalpha.com/input/?i=21%21%2F2%5E64
如果 x^n/n!
在 n=20
时不低于您的阈值 (1e-9
),那么您对 n!
的计算甚至会溢出 64 位整数。当发生这种情况时,您将获得 n!
模 2^63
的值(我进行了简化,因为您没有使用无符号整数,您将获得随机负值,但原理仍然存在)。这些值可能非常低而不是非常高。这将导致您的 x^n/n!
变得更大而不是更小。
fact需要double,不能long long因为divide。