问题描述
我的目标是在Python中获得100.000或200.000正确的Pi小数。为此,我尝试使用Chudnovsky算法,但在此过程中遇到了一些问题。
首先,程序只给我29个字符,而不是我要测试的50个字符。我知道这是一个小问题,但是我不明白自己做错了什么。
第二,只有前14个小数是正确的。之后,我开始根据互联网上所有Pi的编号获取不正确的Pi小数。如何获得更正确的小数位数?
最后,我如何让我的代码在我拥有的所有4个线程上运行?我尝试使用Pool,但似乎无法正常工作。 (已通过Windows任务管理器进行了检查)
这是我的代码:
from math import *
from decimal import Decimal,localcontext
from multiprocessing import Pool
import time
k = 0
s = 0
c = Decimal(426880*sqrt(10005))
if __name__ == '__main__':
start = time.time()
pi = 0
with localcontext() as ctx:
ctx.prec = 50
with Pool(None) as pool:
for k in range(0,500):
m = Decimal((factorial(6 * k)) / (factorial(3 * k) * Decimal((factorial(k) ** 3))))
l = Decimal((545140134 * k) + 13591409)
x = Decimal((-262537412640768000) ** k)
subPi = Decimal(((m*l)/x))
s = s + subPi
print(c*(s**-1))
print(time.time() - start)
解决方法
除了评论中讨论的小细节和@ mark-dickinson提出的小细节之外,我认为我已经修复了多线程,但是我没有机会对其进行测试,请让我知道它是否正常工作
更新:第28位数字后的问题是由于decimal
context
更改之前分配了sq和c所致。更改context
精度后重新分配其值
from math import *
import decimal
from decimal import Decimal,localcontext
from multiprocessing import Pool
import time
k = 0
s = 0
sq = Decimal(10005).sqrt() #useless here
c = Decimal(426880*sq) #useless here
def calculate():
global s,k
for k in range(0,500):
m = Decimal((factorial(6 * k)) / (factorial(3 * k) * Decimal((factorial(k) ** 3))))
l = Decimal((545140134 * k) + 13591409)
x = Decimal((-262537412640768000) ** k)
subPi = Decimal((m*l)/x)
s = s + subPi
print(c*(s**-1))
if __name__ == '__main__':
start = time.time()
pi = 0
decimal.getcontext().prec = 100 #change the precision to increse the result digits
sq = Decimal(10005).sqrt()
c = Decimal(426880*sq)
pool = Pool()
result = pool.apply_async(calculate)
result.get()
print(time.time() - start)