c++ - 在C++中对π的莱布尼兹求和的计数迭代

标签 c++ loops pi

我的任务是询问用户他们希望求和与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/

相关文章:

c++ - 最小化无边界对话框问题

algorithm - pi(π)是怎么计算出来的?

java - Java中如何使用多线程编写圆周率计算程序?

c++ - 函数未在此范围内声明?

c++ - 在 Eigen 中乘以稀疏子矩阵

python - 如何在特定范围内增加列表中的值

jQuery 分组匹配并对 1 和 2 应用不同的样式

javascript - 创建一个函数来获取选择器,就像 jquery 使用纯 javascript 所做的那样

linux - 在 pi 上流式传输视频的更有效方式

c++ - 我如何在 Qt Creator 项目中使用 restclient-cpp?