我正在尝试使用泰勒系列编写一个接近e ^ x的程序,如下所示:
我创建了一个函数,它将进行求和,取n(求和的次数)和x(指数)和另一个接受数字并返回其阶乘的函数。我觉得很简单的东西。我遇到的问题是,当我首先输入小数x(例如,.5,6)时,程序就会挂起。如果我先输入类似(3,6)的东西,然后在计算之后,我输入(.5,6)我会得到一个无限循环。如果x I输入不是分数,我可以根据需要进行多次计算。
我觉得它必须与我对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;
有人可以帮我弄清楚为什么这不起作用吗?
答案 0 :(得分:1)
没关系算法的一些低效率,最有可能导致您的函数看起来无法返回的原因是x
的解析错误,因此n
根本没有设置,这意味着它可以保留任何随机值。
你的专栏:
cin >> x >> n;
如果无法正确解析x
,那么它将不会尝试解析下一个数字,因为输入流将处于错误状态。
如果n
尚未初始化,它可以保留任何实际上可能是极大整数的值。因此,您的算法似乎永远不会返回。
int main()
{
double x = 0.0;
int n = 0;
double error = 0;
cout << "please enter x and n: ";
cin >> x >> n;
if( cin )
{
cout << "taylor series sum, x=" << x << " n=" << n << " : ";
cout << taylorSeries (x, n, error) << endl;
cout << "error = " << error;
}
else
{
cerr << "invalid input" << endl;
}
}
更高效的算法:
double taylorSeries (double x, int n, double &error)
{
double sum = 1;
double xpow = x; // would start at 1 but we have implemented exponent of 0
double fact = 1;
for (int i=1; i <= n; i++)
{
fact *= i;
sum += xpow / fact;
xpow *= x;
}
error = fabs(exp(x) - sum);
return sum;
}
您的factorial
功能在技术上是正确的,直到它会溢出。