简单计算 PI 的方法

#+SETUPFILE: ~/Dropbox/Doc/Org_Templates/level-1.org

这几天搞一个虚拟机自动迁移的测试, 为了满足在特定 CPU 条件下触发迁移的条件, 需要有进程不断的在消耗 CPU 资源, 这类程序当然可以随便乱写, 来个 for (;;;) 之类的就可以完全满足. 但是, 本着专业的精神, 我决定用计算 π 来达到消耗 CPU 资源的目的.

学过一点级数展开的都知道下面这个著名的 π 的莱布尼茨公式:

下面是直接用这个代码的 C++ 测试程序, 当然, 由于我用一个浮点型来保存结果的, 精度不可能搞得离谱, 要获得更高的精度, 麻烦还是用一个大数组吧 :)

#include <math.h>
#include <iostream>
#include <iomanip>

using namespace std;

/**
 * 使用传说中的计算 PI 的莱布尼茨公式:
 * pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - ... + (-1)^n/(2n + 1)
 * 
 */
#define END 7                   /* 精确到小数点后 7 位 */

int main(int argc, char *argv[])
{
    double ret = 0;
    long long n = 0;
    int mark = 1;
    double precision = pow(10, -END - 1);

    while (1) {
        double f = (double)mark / (2 * n + 1);
        ret += f;
        if ((mark * f) < precision) { /* 计算精度 */
            break;
        }
        n += 1;
        mark = -mark;
    }

    cout << "PI ≈ " << setprecision(9) << ret * 4 << endl;
    return 0;
}

另外, 高中时候学过的最简单的:

tan(4/π) = 1
=> 4/π = arctan(1)
=> π = 4 * arctan(1)

所以可以利用 glibc 提供的 API 直接算 PI.

double pi = atan(1) * 4;

这还不是最简单, 最简单的算 π 的方法, 如果熟悉 linux 下 bc 的童鞋应该想到了, 在 bc 中, 用函数 a (x) 可以计算反正切, 设置变量 scale 为想要的精度, 于是用 bc 计算就如此之简单了:

$ echo "scale=10;4*a(1)"|bc -l
3.1415926532

想要消耗 CPU 资源, 你把 scale 设置为 100000 试试.

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦