大家好,欢迎来到IT知识分享网。
1 说明:
=====
1.1 学习python求π值的方法探讨。
1.2 资料来自网络,大多注明,仅供学习。
2 π:
===
2.1 π就是圆周率。
2.2 阿基米德(公元前287–212 年) ,古希腊大数学家,开创了人类历史上通过理论计算圆周率π近似值的先河。
2.3 祖冲之,南北朝时代著名数学家,进一步得出精确到小数点后7位的π值。
3 python求π值:
===========
3.1 直接调用法:
import math val = math.pi print(val)
3.2 马青公式简洁法:π=16arctan1/5-4arctan1/239
import math π=4*(4*math.atan(1/5)-math.atan(1/239)) print(π) #3.97936
3.3 math法代码:
import math def main(): a=1.0 b=1.0/math.sqrt(2) t=1.0/4.0 p=1.0 for i in range(1000): 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) print("Pi is approximately: "+str(my_pi)) if __name__== "__main__": main()
3.4 公式法代码:
''' #代码来源: #https://blog.csdn.net/weixin_/article/details/ 通过公式计算圆周率 当k正无穷 π=[1/16^k*(4/(8*k+1)-2/(8*k+4)- 1/(8*k+5)-1/(8*k+6))] ''' pi = 0 N = 100 for k in range(N): pi += 1/pow(16,k)*(\ 4/(8*k+1)-2/(8*k+4)-\ 1/(8*k+5)-1/(8*k+6)) print("圆周率的值是:{}".format(pi)) #圆周率的值是: 3.9793
3.5 马青公式复杂代码:
#第1步:说明 # -*- coding: utf-8 -*- #代码来源: #https://blog.csdn.net/lnotime/article/details/?utm_medium=distribute.pc_relevant.none-task-blog-title-5&spm=1001.2101.3001.4242 #计算准确圆周率的马青公式:π=16arctan1/5-4arctan1/239 #这个公式由英国天文学教授约翰·马青于1706年发现。 #马青公式 #第 2步:函数定义:n一般为100 def pi(n): p = 10 ** (n + 10) # 准备初始整数,先多乘 k 个 0,以增加精度,最后再去掉,这里我取 k=10 a = p * 16 // 5 # 第一项的前半部分 b = p * 4 // -239 # 第一项的后半部分 f = a + b # 第一项的值 p = f # π j = 3 while abs(f): # 当|f|=0后计算π的值就不会再改变了 a //= -25 # 第n项的前半部分 b //= -57121 # 第n项的后半部分 f = (a + b) // j p += f j += 2 return p // 10**10 # 去掉 k 位,k=10 #第3步:取值 x=pi(100) #打印 print(x)
3.6 丘德诺夫斯基法:
#第1步:说明:任意位数π # -*- coding: UTF-8 -*- # 丘德诺夫斯基法計算高精度圓周率程序 # Calculating PI with Chudnovsky-Series # Author: Idealguy,2018, Shanghai #参考文章:https://blog.csdn.net/idealguy/article/details/ #第2步:定义函数 def Sqrt10005(): n1=0 c= #100.0 mc=8; m=mc f1=10**mc f2=f1*f1 a=10005*f2-c*c while mc<n: a*=f2 b=c*2*f1 d=a//b c=c*f1+d a-=d*(b+d) mc+=m if mc*2>n: m=n-mc else: m=mc f1=10**m f2=f1*f1 n1+=1 return c #第3步:循环 print ("Chudnovsky法計算高精度圓周率程序") while 1: n=int(input('計算位數[1..50000],0:退出:')) if n<=10: break n+=2 base=10**n A=*base; B=A c3= i=1 while abs(A)>5: c1=((108-72*i)*i-46)*i+5 c2=032000*i**3 c4=c3; c3+= i+=1 A=A*c1*c3//(c2*c4) B+=A p=*base*Sqrt10005()//B//100 s=input('是否显示结果(Y/N):') if (s=='Y')|(s=="y"): print ("PI="+str(p))
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/51475.html