首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EXP to Taylor级数

EXP to Taylor级数
EN

Stack Overflow用户
提问于 2011-03-19 22:04:20
回答 2查看 3.5K关注 0票数 2

我正在尝试将exp(x)函数扩展到Taylor级数。下面是代码:

代码语言:javascript
复制
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。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-19 22:16:54

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

另一个解决方法是将以下代码添加到您的循环中:

代码语言:javascript
复制
if (sum > 1E305) {
  // we'll most likely run into an infinite loop
  break;
}

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

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

代码:

代码语言:javascript
复制
#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;
}
票数 5
EN

Stack Overflow用户

发布于 2011-03-19 23:38:52

需要建议。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5362573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档