1671年,英国天文学家詹姆斯·格雷果里(James Gregory)提出了一个反正切函数的幂级数展开式,即
又已知,
也就是
把x=1带入格雷果里幂级数展开式得到
这就是著名的用来计算圆周率近似值的莱布尼兹公式。
参考代码:
上面的莱布尼兹公式收敛速度非常慢,用来计算圆周率近似值的效果并不是很好,需要计算很多很多很多项才能得到稍微满意的圆周率近似值。
后来有不少学者提出了改进算法,我国清朝数学家曾纪鸿(曾国藩次子)也对此做出过不小的贡献。
1706年英国天文学家约翰·梅钦(John Machin)提出了一个非常巧妙的公式可以精确计算圆周率的任意小数位,
将其使用格雷果里幂级数展开,得
参考代码:
上面程序虽然利用了标准库decimal提供的高精度实数并且设置了很大的小数位数,但仍受到精度的限制,每次计算都存在舍入误差,计算结果仍差强人意。
改写上面的梅钦公式,等号两边同时乘以10的N次方,把实数运算变为整数运算,可以准确计算圆周率任意位小数。
参考代码: