gpt4 book ai didi

c++ - 求和泰勒级数时使用小数基会导致无限循环?

转载 作者:行者123 更新时间:2023-11-28 06:40:01 26 4
gpt4 key购买 nike

我正在尝试编写一个使用泰勒级数近似 e^x 的程序,如下所示: taylor-series for exp(x)

我创建了一个函数来进行求和,接受 n(求和的次数)和 x(指数),另一个函数接受一个数字并返回它的阶乘。我认为很简单的东西。我遇到的问题是,当我先输入小数 x(例如 .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 的错误解析,因此 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 函数在技术上是正确的,直到它溢出为止。

关于c++ - 求和泰勒级数时使用小数基会导致无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26142839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com