【发布时间】:2014-10-01 22:09:50
【问题描述】:
我正在尝试编写一个使用泰勒级数近似 e^x 的程序,如下所示:
我创建了一个函数来进行求和,接受 n(求和的次数)和 x(指数)以及另一个接受数字并返回其阶乘的函数。我认为很简单的东西。我遇到的问题是,当我先输入一个小数 x(例如,0.5、6)时,程序就会挂起。如果我首先输入 (3, 6) 之类的内容,然后在计算之后输入 (.5, 6),我将得到一个无限循环。如果我输入的 x 不是分数,我可以计算任意多次。
我觉得这一定与我对 pow() 函数的调用有关。我想我使用正确(pow(double,int))但它不需要分数或其他东西吗?我不明白。
这是我的代码:
double taylorSeries (double x, int n, double &error)
{
double sum = 0;
for (int i=0; i <= n; i++)
sum += (pow (x, i))/(factorial (i));
error = (fabs(exp(x) - sum));
return sum;
}
long factorial(int n)
{
long factorial=0;
for (int i = 0; i <= n; i++){
if (i == 0)
factorial = 1;
else
factorial = factorial * i;
}
return factorial;
}
然后在 main 中调用 taylorSeries 函数如下所示:
cout << "please enter x and n: ";
cin >> x >> n;
cout << "taylor series sum = " ;
cout << taylorSeries (x, n, error) << endl;
//cout << "error = " << error;
谁能帮我弄清楚为什么这不起作用?
【问题讨论】:
-
我不建议使用与数字相同的名称“阶乘”。
-
x在main中是否定义为double?我猜是int。 -
在调用函数之前验证您的 x 和 n。打印它们。检查您的流是否正确读取它们。
-
factorial过于复杂但正确。虽然在外部范围内隐藏名称很容易出错。 -
顺便说一句,从技术上讲,这不是泰勒级数,它是一种从 f(x) 和导数评估 f(x+d) 的方法。在某种意义上它是相似的,它是一个具有阶乘系数的无限级数
标签: c++