一般网上都采用格雷戈里 - 莱布尼茨无穷级数计算π。需要迭代 500000 次后可计算出 Pi 的 10 位小数。公式如下:
π = (4/1) - (4/3) + (4/5) - (4/7) + (4/9) - (4/11) + (4/13) - (4/15) …
首先用 4 减去 4 除以 3,然后加上4除以5,然后减去4除以7。反复变换使用加减法,后面的小数是用4作分子,用连续的奇数作分母。计算的次数越多,则结果越接近 Pi。
测试了一下,性价比不高,尤其是增加精度后耗时指数式增加。
我忽然想到可以用勾股定理和面积公式计算圆周率,如图所示:

设:x1 = x2 = x3 …… = xn = 1
则π = 4*(y1 + y2 + y3 + … + yn) / r ^ 2
于是写了一个更简单的算法:
double getPi(int step) {
double pi, x, y, xx, s, r; //xx是x的平方的意思
r = std::pow(10, step + 1); //10的幂次方
double rr = r * r, yy = rr; //rr是半径的平方的意思
for (x = 0; x < r; x += 1) {
xx


1305

被折叠的 条评论
为什么被折叠?



