用户:
SunshineCode查看:7 回复:9 评论:7 创建时间:2019-06-19T13:53:29
话不多说,直接上代码:
n = int(input('请键入想要计算到小数点后的位数:')) #先键入字符串,再转化为整数
w = n+10 #多计算10位,防止尾数取舍的影响
b = 10**w #算到小数点后w位
x1 = b*4//5 #求含4/5的首项
x2 = b// -239 #求含1/239的首项
he = x1+x2 #求第一大项
n *= 2 #设置下面循环的终点,即共计算n项
for i in range(3,n,2): #循环初值=3,末值n,步长=2
x1 //= -25 #求每个含1/5的项及符号
x2 //= -57121 #求每个含1/239的项及符号
x = (x1+x2) // i #求两项之和
he += x #求总和
pai = he*4 #求出π
pai //= 10**10 #舍掉后十位
print(pai)#输出圆周率π的值
这段代码不知道是哪个牛人写的,反正不是我。
计算速度太快了!
更神奇的是,这段代码用的是马青公式计算圆周率。要知道用Python正常速度,马青公式算1万位是要半分多钟的!
亲测:
100位,按下回车直接输出
1000位,约0.2秒
3000位,不到1秒
5000位,1秒左右
8000位,3秒左右
1w位,5~6秒
1.5w位,约11秒
2w位,约23秒
速度真快,至少是在用马青公式计算圆周率的程序中
真牛AGM公式: fromdecimalimport* getcontext().prec=10000#位数 a=x=Decimal(1)b=Decimal(1)/Decimal(2).sqrt()c=Decimal(1)/Decimal(4) foriinrange(0,20):y=aa=(a+b)/喵=(b*y).sqrt()c-=x*((a-y)**2)x*=2 withopen("派.txt","w")aspi:#数量大,输入到文件里pi.write(str((a+b)**2/(4*c))) _______________________________分割线___________________________________ 参考论文:EugeneSalamin于喵发表于 MathematicsofComputation 上的论文 ComputationofpiUsingArithmetic-GeometricMean 1w位0.9963607788085938秒
点赞0
评论
真牛from decimal import *
import time
time_start = time.time()
getcontext().prec = 10000
a=x=Decimal(1)
b=Decimal(1)/Decimal(2).sqrt()
c=Decimal(1)/Decimal(4)
for i in range(0,20):
y=a
a=(a+b)/2
b=(b*y).sqrt()
c-=x*((a-y)**2)
x*=2
time_end=time.time()
print('totally cost',time_end-time_start)
点赞1
评论