求圆周率的多种方法

圆周率作为典型的无理数,如何求一直是我们密切关注的问题,今天这篇文章带来几种求圆周率方法的代码。

方法一:莱布尼兹级数法

公式如下:

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))

对比结果就可以得到更结果啦~

  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值