我的任务是询问用户他们希望求和与pi的实际值相比要迭代多少精度的小数位。因此,当循环达到3.14时,小数点后2位将停止。我有一个完整的程序,但不确定它是否按预期工作。我已经用计算器检查了0和1小数位,它们似乎可以工作,但我不想假设它对所有这些都有效。另外,由于仍在学习基础知识,我的代码可能有些笨拙。我们只学习了循环和嵌套循环。如果有任何明显的错误或零件可以清除,我将不胜感激。
编辑:我只需要这项工作最多五个小数位。这就是为什么我的pi值不精确的原因。很抱歉对于这个误会。
#include <iostream>
#include <cmath>
using namespace std;
int main() {
const double PI = 3.141592;
int n, sign = 1;
double sum = 0,test,m;
cout << "This program determines how many iterations of the infinite series for\n"
"pi is needed to get with 'n' decimal places of the true value of pi.\n"
"How many decimal places of accuracy should there be?" << endl;
cin >> n;
double p = PI * pow(10.0, n);
p = static_cast<double>(static_cast<int>(p) / pow(10, n));
int counter = 0;
bool stop = false;
for (double i = 1;!stop;i = i+2) {
sum = sum + (1.0/ i) * sign;
sign = -sign;
counter++;
test = (4 * sum) * pow(10.0,n);
test = static_cast<double>(static_cast<int>(test) / pow(10, n));
if (test == p)
stop = true;
}
cout << "The series was iterated " << counter<< " times and reached the value of pi\nwithin "<< n << " decimal places." << endl;
return 0;
}
最佳答案
莱布尼兹求和的问题之一是它具有极低的收敛速度,因为它表现出亚线性收敛。在您的程序中,您还需要将计算出的π的期望值与给定值(近似为6位数字)进行比较,而总和的目的是找出正确的数字。
如果所需的数字在两次迭代之间没有变化,则可以稍微修改代码以使其终止计算(我还添加了最大迭代次数检查)。请记住,您使用的不是无限精度数double
,四舍五入的迟早错误都会影响计算。实际上,此代码的真正局限性在于它需要进行的迭代次数(需要2,428,700,925来获得3.141592653
)。
#include <iostream>
#include <cmath>
#include <iomanip>
using std::cout;
// this will take a long long time...
const unsigned long long int MAX_ITER = 100000000000;
int main() {
int n;
cout << "This program determines how many iterations of the infinite series for\n"
"pi is needed to get with 'n' decimal places of the true value of pi.\n"
"How many decimal places of accuracy should there be?\n";
std::cin >> n;
// precalculate some values
double factor = pow(10.0,n);
double inv_factor = 1.0 / factor;
double quad_factor = 4.0 * factor;
long long int test = 0, old_test = 0, sign = 1;
unsigned long long int count = 0;
double sum = 0;
for ( long long int i = 1; count < MAX_ITER; i += 2 ) {
sum += 1.0 / (i * sign);
sign = -sign;
old_test = test;
test = static_cast<long long int>(sum * quad_factor);
++count;
// perform the test on integer values
if ( test == old_test ) {
cout << "Reached the value of Pi within "<< n << " decimal places.\n";
break;
}
}
double pi_leibniz = static_cast<double>(inv_factor * test);
cout << "Pi = " << std::setprecision(n+1) << pi_leibniz << '\n';
cout << "The series was iterated " << count << " times\n";
return 0;
}
我在此表中总结了几次运行的结果:
digits Pi iterations
---------------------------------------
0 3 8
1 3.1 26
2 3.14 628
3 3.141 2,455
4 3.1415 136,121
5 3.14159 376,848
6 3.141592 2,886,751
7 3.1415926 21,547,007
8 3.14159265 278,609,764
9 3.141592653 2,428,700,925
10 3.1415926535 87,312,058,383
关于c++ - 在C++中对π的莱布尼兹求和的计数迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35957856/