圆周率作为典型的无理数,如何求一直是我们密切关注的问题,今天这篇文章带来几种求圆周率方法的代码。
方法一:莱布尼兹级数法
公式如下:
n = int(input())
PI = 0
for i in range(n):
PI += (-1)**i/(2*i+1)
PI *= 4
print(PI)
通过改变n的值改变计算得圆周率的精度。
方法二:BBP公式
公式如下
pi=0
N=100
for i in range(N):
pi+=1/pow(16,i)*(4/(8*i+1)-2/(8*i+4)-1/(8*i+5)-1/(8*i+6))
print(pi)
方法三:蒙特卡洛法
方法如下
def m(DARTS):
import random
import math
DARTS = 100000
hits = 0.0
random.seed()
for i in range(1, DARTS + 1):
x, y = random.random(), random.random()
dist = math.sqrt(x ** 2 + y ** 2)
if dist <= 1.0:
hits += 1
pi = 4 * (hits / DARTS)
return pi
这里我写成了一个函数的形式,是为了方便后面的比较,大家可以自行修改
方法四:欧拉公式
公式如下
def o(n):
import math
n = 10000000
sum = 0
for i in range(n):
sum += 1 / (i + 1) ** 2
pi = math.sqrt(6 * sum)
return pi
以上这些方法选取的n越大,则计算得的π值越精确,但是不可能无限大,会数据溢出。我们不妨对比一下不同的方法计算π,哪种收敛的更快,以方法三和方法四为例
import math
pi1 = o(10000)
pi2 = m(10000)
print(pi1,pi2)
print(abs(pi1-math.pi))
print(abs(pi2-math.pi))
对比结果就可以得到更结果啦~