泰勒系列函数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!的值20! 。 请参阅: http : //www.wolframalpha.com/input/?i = 21%21%2F2%5E64

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

事实上需要加倍,因为分歧不可能长久。