在c ++中使用泰勒级数计算Pi的函数
所以我对为什么我的代码不工作而感到茫然,实际上我正在写的函数使用泰勒系列计算Pi的估计值,只要我尝试运行程序就会崩溃。
这是我的代码
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
double get_pi(double accuracy)
{
double estimate_of_pi, latest_term, estimated_error;
int sign = -1;
int n;
estimate_of_pi = 0;
n = 0;
do
{
sign = -sign;
estimated_error = 4 * abs(1.0 / (2*n + 1.0)); //equation for error
latest_term = 4 * (1.0 *(2.0 * n + 1.0)); //calculation for latest term in series
estimate_of_pi = estimate_of_pi + latest_term; //adding latest term to estimate of pi
n = n + 1; //changing value of n for next run of the loop
}
while(abs(latest_term)< estimated_error);
return get_pi(accuracy);
}
int main()
{
cout << get_pi(100);
}
代码背后的逻辑如下:
感谢您的帮助,我可能会得到
你的功能有几个错误。 以“// NOTE:”开始,看到我的评论。
double get_pi(double accuracy)
{
double estimate_of_pi, latest_term, estimated_error;
int sign = -1;
int n;
estimate_of_pi = 0;
n = 0;
do
{
sign = -sign;
//NOTE: This is an unnecessary line.
estimated_error = 4 * abs(1.0 / (2*n + 1.0)); //equation for error
//NOTE: You have encoded the formula incorrectly.
// The RHS needs to be "sign*4 * (1.0 /(2.0 * n + 1.0))"
// ^^^^ ^
latest_term = 4 * (1.0 *(2.0 * n + 1.0)); //calculation for latest term in series
estimate_of_pi = estimate_of_pi + latest_term; //adding latest term to estimate of pi
n = n + 1; //changing value of n for next run of the loop
}
//NOTE: The comparison is wrong.
// The conditional needs to be "fabs(latest_term) > estimated_error"
// ^^^^ ^^^
while(abs(latest_term)< estimated_error);
//NOTE: You are calling the function again.
// This leads to infinite recursion.
// It needs to be "return estimate_of_pi;"
return get_pi(accuracy);
}
另外, main
的函数调用是错误的。 它需要是:
get_pi(0.001)
以表明如果该项的绝对值小于0.001,该函数可以返回。
以下是适用于我的功能的更新版本。
double get_pi(double accuracy)
{
double estimate_of_pi, latest_term;
int sign = -1;
int n;
estimate_of_pi = 0;
n = 0;
do
{
sign = -sign;
latest_term = sign * 4 * (1.0 /(2.0 * n + 1.0)); //calculation for latest term in series
estimate_of_pi += latest_term; //adding latest term to estimate of pi
++n; //changing value of n for next run of the loop
}
while(fabs(latest_term) > accuracy);
return estimate_of_pi;
}
您的退货声明可能是原因。
尝试返回“estimate_of_pi”而不是get_pi(准确性)。
您的休息条件可以重写为
2*n + 1 < 1/(2*n + 1) => (2*n + 1)^2 < 1
对于任何肯定的n
,这都不会true
。 因此你的循环永远不会结束。 解决此问题后,您应该将return语句更改为
return estimated_error;
您目前正在递归调用函数而没有结束(假设您修复了停止条件)。
无论如何,你有一个sign
和参数的accuracy
,你完全不用在计算中。
我对这样的迭代的建议是总会在最大迭代次数上打破。 在这种情况下,你知道它会收敛(假设你修复了数学),但是总的来说,你永远无法确定你的迭代收敛了。
链接地址: http://www.djcxy.com/p/12245.html