给出一个数字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);
答案 0 :(得分:0)
您不应使用pow
函数将(可能为负数)数字提升为整数幂。而是像计算阶乘一样使用重复乘法。
另请注意,您可以存储$ n!$和$ x ^ k $的最后计算值,以便通过单次乘法获得$(n + 1)!$和$ x ^ {k + 1} $。< / p>
答案 1 :(得分:0)
你的问题是你的因子计算溢出并变成垃圾。
之后,您的ith
字词不再减少并产生完全错误的结果。
经过20次迭代后,64位数不能包含20!
的值。请参阅:{{3}}
如果x^n/n!
在1e-9
时n=20
不低于您的阈值(n!
),则n!
的计算将溢出甚至64位整数。当发生这种情况时,您将获得2^63
modulo x^n/n!
的值(我简化,因为您没有使用无符号整数,您将获得随机负值,但原则仍然存在)。这些值可能非常低而不是非常高。这会导致{{1}}变大而不是变小。
答案 2 :(得分:0)
事实上需要加倍,因为分歧而不能长久。