【问题标题】:Taylor series of function e^x泰勒级数函数 e^x
【发布时间】:2016-01-24 20:19:02
【问题描述】:

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

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

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

下面是我的解决方案,但 x

    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);

【问题讨论】:

  • 那些变量是什么类型...如果你没有给我们足够的编译,你还没有给我们足够的调试
  • 对不起,我刚刚添加了。
  • 好的,谢谢。我忘记了。但是结果又错了。例如,如果 x=-2 输出为 0.33333,则需要为 0.13533,对于 x=-4 sum=0.192240,则需要为 0.018316 等...
  • 你在使用命名空间标准吗?您是否包含 cmath 或 math.h?如果您显式转换数据类型也会很好
  • 晶圆厂,浮点腹肌,我的错。

标签: c taylor-series


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您的问题是您的阶乘计算溢出并变成垃圾。 之后,您的 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! 变得更大而不是更小。

    【讨论】:

    • 我不确定,你能否解释得更好。我发现问题出在事实类型上,当我将事实更改为加倍时,它适用于少数人(这就是我所需要的)。我不知道为什么。我会要求您更好地解释您的答案,因为它看起来很有趣,我同意该解决方案有溢出,但没有什么意义。
    • 是的,我同意。谢谢你的解释。但我不能使用 unsigned int 因为 x 可以是负数。
    • @dreamer 使用unsigned 不会改变问题。它只会产生精确的模数(mod 2^63),而不是模数的二进制补码解释。但问题仍将存在。如果这个解释对你有帮助,别忘了点赞。
    【解决方案3】:

    事实要加倍,不能因为分而长。

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 2014-05-28
      • 2017-09-01
      • 2018-09-13
      相关资源
      最近更新 更多