神奇的数字2:利用自然数平方的倒数之和来求π值

欧拉解决了著名的自然数平方倒数之和等于π^2/6,如下图所示,这里对证明不做解释,可以自行搜索。

我们直接上代码, 计算π值。

#include <iostream>
#include <mpir.h>
#include <mpirxx.h>

using namespace std;

int main()
{
    // π^2/6 = 1/1^2 + 1/2^2 + 1/3^ + 1/4^2 + 1/5^2 + ...
    mpf_class M;
    mpf_class P;
    mpf_class I;
    mpf_class S;
    mpf_class N;
    mpf_class Q;
    mpf_class D;

    mp_bitcnt_t prec = 300;

    mpf_set_prec(I.get_mpf_t(), prec);
    mpf_set_prec(M.get_mpf_t(), prec);
    mpf_set_prec(P.get_mpf_t(), prec);
    mpf_set_prec(S.get_mpf_t(), prec);
    mpf_set_prec(Q.get_mpf_t(), prec);
    mpf_set_prec(D.get_mpf_t(), prec);

    M = 0;
    P = 0;
    S = 0;
    N = "100";
    mp_exp_t exp = 0;
    char* Val;

    for (I = 1; I <= N; I++)
    {
        Q = I * I;
        D = 1 / Q;
        M += D;
    }

    S = 6 * M;
    P = sqrt(S);
    exp = 0;
    Val = mpf_get_str(NULL, &exp, 10, 0, I.get_mpf_t());
    cout << "I:" << Val << endl;
    free(Val);

    exp = 0;
    Val = mpf_get_str(NULL, &exp, 10, 0, P.get_mpf_t());
    cout << "P:" << Val << endl;
    free(Val);
    cout << "exp:" << exp << endl;
}

当 N = 100 的时候,计算的结果是

上面的exp 表示数点的位置,1位,计算的结果为3.132,接近值为3.1

当 N = 1000 的时候(翻10倍),1千计算的结果是

计算的结果接近值为3.14

当 N = 10000 的时候(翻10倍),1万计算的结果是

计算的结果接近值为3.141

当 N = 100000 的时候(翻10倍),10万计算的结果是

计算的结果接近值为3.1415

当 N = 1000000 的时候(翻10倍),百万计算的结果是

计算的结果接近值为3.14159

当 N = 100000000 的时候(翻100倍),亿次的计算的结果是

计算的结果接近值为3.1415926

其实可以发现,如果每增加一位数字,N就要翻10倍,自然计算量也是翻10倍,这样计算所花的时间是越来越多。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注