在对泰勒序列求和时使用分数基会导致无限循环?

时间:2014-10-01 13:42:23

标签: c++

我正在尝试使用泰勒系列编写一个接近e ^ x的程序,如下所示:  taylor-series for exp(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;

有人可以帮我弄清楚为什么这不起作用吗?

1 个答案:

答案 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功能在技术上是正确的,直到它会溢出。