【问题标题】:EXP to Taylor seriesEXP 到泰勒级数
【发布时间】:2011-03-19 23:38:51
【问题描述】:

我正在尝试将 exp(x) 函数扩展到泰勒级数。这是代码:

double CalcExp(){
double eps = 0.0000000000000000001;
double elem = 1.0;
double sum = 0.0;
int i = 1;
sum = 0.0;
do {
    sum += elem;
    elem *= x / i;
    i++;
} while (elem >= eps);
return sum;

}

问题是当我输入大 X 或负 X 时,我的程序崩溃了。 当我像“0.00000000001”一样输入X时,结果是-1。

需要建议。谢谢你的帮助。

【问题讨论】:

    标签: c++ taylor-series exp


    【解决方案1】:

    对于较大的 X 值(大约 700 及以上),您将达到双精度数的范围限制 (10^308) 并导致无限循环。您对此无能为力,您应该限制 X 输入范围或使用一些大数字库来扩展范围。

    另一种解决方法是将其添加到您的循环中:

    if (sum > 1E305) {
      // we'll most likely run into an infinite loop
      break;
    }
    

    请注意,您应该在之后在循环之外处理这种情况,以避免打印出非常大的错误结果。

    我无法重现 0.00000000001 的问题,这只是为我返回 1。负值也可以正常运行,尽管结果错误,这似乎是算法中的错误/限制。编辑:要纠正这个问题,我们可以使用e^-x1 / e^x 相同的事实。

    代码:

    #include <stdio.h>
    
    double CalcExp(double x){
      double eps = 0.0000000000000000001;
      double elem = 1.0;
      double sum = 0.0;
      bool negative = false;
      int i = 1;
      sum = 0.0;
      if (x < 0) {
        negative = true;
        x = -x;
      }
      do {
        sum += elem;
        elem *= x / i;
        i++;
        if (sum > 1E305) break;
      } while (elem >= eps);
      if (sum > 1E305) {
        // TODO: Handle large input case here
      }
    
      if (negative) {
        return 1.0 / sum;
      } else {
        return sum;
      }
    }
    
    int main() {
      printf("%e\n", CalcExp(0.00000000001)); // Output: 1.000000e+000
      printf("%e\n", CalcExp(-4));            // Output: 1.831564e-002
      printf("%e\n", CalcExp(-45));           // Output: 2.862519e-020
      printf("%e\n", CalcExp(1));             // Output: 2.718282e+000
      printf("%e\n", CalcExp(750));           // Output: 1.375604e+305
      printf("%e\n", CalcExp(7500000));       // Output: 1.058503e+305
      printf("%e\n", CalcExp(-450000));       // Output: 9.241336e-308
      return 0;
    }
    

    【讨论】:

    • 哇!再一次非常感谢你!这段代码运行完美。你救了我:)
    【解决方案2】:

    需要建议。

    尝试在调试器中单步执行您的程序,看看哪里出了问题。如果您没有调试器,请在循环中插入 print 语句以监控发生变化的变量的值。

    【讨论】:

      猜你喜欢
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2017-08-21
      • 2011-11-04
      • 2017-12-02
      • 2014-02-23
      • 1970-01-01
      相关资源
      最近更新 更多