π是一个无数人追随的真正的神奇数字。我不是很清楚一个永远重复的无理数的迷人之处。在我看来,我乐于计算π,也就是计算π的值。因为π是一个无理数,它是无限的。这就意味着任何对π的计算都仅仅是个近似值。如果你计算100位,我可以计算101位并且更精确。迄今为止,有些人已经选拔出超级计算机来试图计算最精确的π。一些极值包括 计算π的5亿位。你甚至能从网上找到包含 π的一百亿位的文本文件(注意啦!下载这个文件可能得花一会儿时间,并且没法用你平时使用的记事本应用程序打开。)。对于我而言,如何用几行简单的Python来计算π才是我的兴趣所在。

你总是可以 使用 math.pi 变量的 。它被 包含在 标准库中, 在你试图自己 计算它之前,你应该去使用它 。 事实上 , 我们将 用它来计算 精度 。作为 开始, 让我们看 一个 非常直截了当的 计算Pi的 方法 。像往常一样,我将使用Python 2.7,同样的想法和代码可能应用于不同的版本。我们将要使用的大部分算法来自 Pi WikiPedia page并加以实现。让我们看看下面的代码:importsys

importmath

defmain(argv):

iflen(argv) !=1:

sys.exit('Usage: calc_pi.py ')

print'\nComputing Pi v.01\n'

a=1.0

b=1.0/math.sqrt(2)

t=1.0/4.0

p=1.0

foriinrange(int(sys.argv[1])):

at=(a+b)/2

bt=math.sqrt(a*b)

tt=t-p*(a-at)**2

pt=2*p

a=at;b=bt;t=tt;p=pt

my_pi=(a+b)**2/(4*t)

accuracy=100*(math.pi-my_pi)/my_pi

print"Pi is approximately: "+str(my_pi)

print"Accuracy with math.pi: "+str(accuracy)

if__name__=="__main__":

main(sys.argv[1:])

这是个非常简单的脚本,你可以下载,运行,修改,和随意分享给别人。你能够看到类似下面的输出结果:

你会发现,尽管 n 大于4 ,我们逼近 Pi 精度却没有多大的提升。 我们可以猜到即使 n的值更大,同样的事情(pi的逼近精度没有提升)依旧会发生。幸运的是,有不止一种方法来揭开这个谜。使用 Python Decimal (十进制)库,我们可以就可以得到更高精度的值来逼近Pi。让我们来看看库函数是如何使用的。这个简化的版本,可以得到多于11位的数字 通常情况小Python 浮点数给出的精度。下面是Python Decimal 库中的一个例子 :

看到这些数字。不对! 我们输入的仅是 3.14,为什么我们得到了一些垃圾(junk)? 这是内存垃圾(memory junk)。 在坚果壳,Python给你你想要的十进制数,再加上一点点额外的值。 只要精度小于垃圾号码开始时,它不会影响任何计算只要精度小于前面的垃圾号码(junk number)开始时。 您可以指定你想要多少位数的通过设置getcontext().prec 。我们试试。

很好。 现在让我们 试着用这个 来 看看我们是否能 与我们以前的 代码 有更好的 逼近 。 现在, 我通常 是反对 使用“ from library import * ” , 但在这种情况下, 它会 使代码 看起来更漂亮 。importsys

importmath

fromdecimalimport*

defmain(argv):

iflen(argv) !=1:

sys.exit('Usage: calc_pi.py ')

print'\nComputing Pi v.01\n'

a=Decimal(1.0)

b=Decimal(1.0/math.sqrt(2))

t=Decimal(1.0)/Decimal(4.0)

p=Decimal(1.0)

foriinrange(int(sys.argv[1])):

at=Decimal((a+b)/2)

bt=Decimal(math.sqrt(a*b))

tt=Decimal(t-p*(a-at)**2)

pt=Decimal(2*p)

a=at;b=bt;t=tt;p=pt

my_pi=(a+b)**2/(4*t)

accuracy=100*(Decimal(math.pi)-my_pi)/my_pi

print"Pi is approximately: "+str(my_pi)

print"Accuracy with math.pi: "+str(accuracy)

if__name__=="__main__":

main(sys.argv[1:])

输出结果:

好了。我们更准确了,但看起来似乎有一些舍入。从n = 100和n = 1000,我们有相同的精度。现在怎么办?好吧,现在我们来求助于公式。到目前为止,我们计算Pi的方式是通过对几部分加在一起。我从DAN 的关于 Calculating Pi 的文章中发现一些代码。他建议我们用以下3个公式:

Bailey–Borwein–Plouffe 公式

Bellard的公式

Chudnovsky 算法

让我们从Bailey–Borwein–Plouffe 公式开始。它看起来是这个样子:

在代码中我们可以这样编写它:import sys

import math

from decimal import *

def bbp(n):

pi=Decimal(0)

k=0

while k < n:

pi+=(Decimal(1)/(16**k))*((Decimal(4)/(8*k+1))-(Decimal(2)/(8*k+4))-(Decimal(1)/(8*k+5))-(Decimal(1)/(8*k+6)))

k+=1

return pi

def main(argv):

if len(argv) !=2:

sys.exit('Usage: BaileyBorweinPlouffe.py ')

getcontext().prec=(int(sys.argv[1]))

my_pi=bbp(int(sys.argv[2]))

accuracy=100*(Decimal(math.pi)-my_pi)/my_pi

print"Pi is approximately "+str(my_pi)

print"Accuracy with math.pi: "+str(accuracy)

if __name__=="__main__":

main(sys.argv[1:])

抛开“ 包装”的代码,BBP(N)的功能是你真正想要的。你给它越大的N和给 getcontext().prec 设置越大的值,你就会使计算越精确。让我们看看一些代码结果:

这有许多数字位。你可以看出,我们并没有比以前更准确。所以我们需要前进到下一个公式,贝拉公式,希望能获得更好的精度。它看起来像这样:

我们将只改变我们的变换公式,其余的代码将保持不变。点击这里下载Python实现的贝拉公式。让我们看一看bellards(n):def bellard(n):

pi=Decimal(0)

k=0

while k < n:

pi+=(Decimal(-1)**k/(1024**k))*( Decimal(256)/(10*k+1)+Decimal(1)/(10*k+9)-Decimal(64)/(10*k+3)-Decimal(32)/(4*k+1)-Decimal(4)/(10*k+5)-Decimal(4)/(10*k+7)-Decimal(1)/(4*k+3))

k+=1

pi=pi*1/(2**6)

return pi

输出结果:

哦,不,我们得到的是同样的精度。好吧,让我们试试第三个公式, Chudnovsky 算法,它看起来是这个样子:

下面是程序和输出结果:def chudnovsky(n):

pi=Decimal(0)

k=0

while k < n:

pi+=(Decimal(-1)**k)*(Decimal(factorial(6*k))/((factorial(k)**3)*(factorial(3*k)))*(13591409+545140134*k)/(640320**(3*k)))

k+=1

pi=pi*Decimal(10005).sqrt()/4270934400

pi=pi**(-1)

return pi

所以我们有了什么结论?花哨的算法不会使机器浮点世界达到更高标准。我真的很期待能有一个比我们用求和公式时所能得到的更好的精度。我猜那是过分的要求。如果你真的需要用PI,就只需使用math.pi变量了。然而,作为乐趣和测试你的计算机真的能有多快,你总是可以尝试第一个计算出Pi的百万位或者更多位是几。

python计算圆周率代码_使用 Python 计算 π 值相关推荐

  1. python计算圆周率代码_用算法实现计算圆周率-几何概型估算圆周率Python编程小程序...

    我在http://tieba.baidu.com/p/5953188922?traceid=看见了一个用 编程计算圆周率的方法 具体详细可以打开链接 发现原作者:百度用户阿泰 C531T因为编程语言的 ...

  2. python计算圆周率近似值_使用python实现计算圆周率π的方法

    使用python实现计算圆周率π的方法 发布时间:2020-11-19 17:34:12 来源:亿速云 阅读:94 这期内容当中小编将会给大家带来有关使用python实现计算圆周率π的方法,文章内容丰 ...

  3. python 运行程序代码_一些python程序

    <从问题到程序:用Python学编程和计算>--1.2 Python语言简介 本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第1章,第1.2节,作者 ...

  4. python好玩的代码_一行 Python 能实现什么丧心病狂的功能?

    能够把自身代码打印出来的程序,叫做Quine.下面是python的一行quine: ​有人说有分号不算一行,无分号版: 其实,如果你用程序语言的名字+quine作为关键字去搜索,你能找到各种语言实现的 ...

  5. python计算器简单代码_自学python之简单计算器

    前戏就不多啰嗦了,自爆一下基础,让想学python的朋友有个信心: 我是平面设计出身,现在主要从事的工作是前端狗,所以说我基础也是很弱的,套用一句世界杯期间的广告语: 我不是天生强大,我只是天生要强! ...

  6. python 圆周率代码_基于Python计算圆周率pi代码实例

    一 计算公式: 二 实现代码 (1) import math from tqdm import tqdm import time total,s,n,t=0.0,1,1.0,1.0 while(mat ...

  7. python计算圆周率近似值_使用MicroPython计算任意位数圆周率

    计算任意精度的圆周率是个有趣的主题,得益于python的强大计算能力,我们在MicroPython中也可以轻松的计算pi的数值. 先输入下面的代码: """ 文件:pi. ...

  8. python计算面积代码_利用Python求阴影部分的面积实例代码

    利用Python求阴影部分的面积实例代码 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  利用Python求阴影部分的面积实例代码.txt ] (友情提示:右键点 ...

  9. python计算圆周率精确_用python计算圆周率

    import math import time scale=14 #scale的值越大,π的值越精确,但运算时间会加长 s,m,=1,2 total,s,n,t=0.0,1,1.0,1.0 print ...

最新文章

  1. 魔法引用函数magic_quotes_gpc和magic_quotes_runtime的区别和用法
  2. 如何在SAP云平台上使用MongoDB服务
  3. 从一个实际的例子来了解线程套间模型(.NET and COM interop)
  4. Makefile 使用总结【转】
  5. 编译linux系统到开发板,迅为3399开发板Linux固件编译-Ubuntu16系统编译
  6. ViewState 与 静态变量的 区别
  7. C++学习系列笔记(三)
  8. MySQL/MariaDB表表达式(3):视图
  9. 今晚博文视点大咖直播伴你读No.2:人工智能学习路线
  10. liunx 中一个命令可以检测 ps -C java --no-heading| wc -l 一般用于shell脚步编写用
  11. JAVA计算机毕业设计中药分类管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  12. 《University Calculus》-chape8-无穷序列和无穷级数-欧拉恒等式
  13. bcdedit编辑启动项 禁用数字签名
  14. STM32 TIM高级定时器死区时间的计算
  15. void指针(void*):void*存放任意对象的地址、通过(int*)a转换指针类型
  16. 新型前端学习成长计划路线规划
  17. 交互技术前沿学习分享——利用眼动追踪改良广告界面
  18. 苹果手机click事件失效
  19. HAL 库中 GPIO 工作模式配置(H7)
  20. 用python做生日礼物_利用python画一份素描合集,给女朋友一份独特生日礼物

热门文章

  1. 负载均衡SLB和LVS的简单介绍
  2. poi excel 导出设置边框,自定义背景色,自定义字体
  3. python中的阶乘求和公式_Python阶乘求和的方法
  4. 矩阵的rank,nullspace以及eigenvalue的理解
  5. 内核源码中版本号详解(KERNEL_VERSION KERNEL_VERSION)
  6. Java 基础 面试题
  7. DNS、域、域名及FQDN 概念
  8. 组合导航(二):导航参考坐标系
  9. Unity两种获取屏幕点击位置的世界坐标方法
  10. Word中跨页表格都显示表头