Python中的1000位pi

Python中的1000位pi,python,pi,Python,Pi,我一直在思考这个问题,但我想不出来。也许你能帮助我。问题是我的代码无法在Python编码语言中输出1000位pi 这是我的密码: def make_pi(): q, r, t, k, m, x = 1, 0, 1, 1, 3, 3 while True: if 4 * q + r - t < m * t: yield m q, r, t, k, m, x = (10*q, 10*(r-m*t), t, k, (

我一直在思考这个问题,但我想不出来。也许你能帮助我。问题是我的代码无法在Python编码语言中输出1000位pi

这是我的密码:

def make_pi():
    q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
    while True:
        if 4 * q + r - t < m * t:
            yield m
            q, r, t, k, m, x = (10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x)
        else:
            q, r, t, k, m, x = (q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2)

digits = make_pi()
pi_list = []
my_array = []
for i in range(1000):
    my_array.append(str("hello, I'm an element in an array \n" ))
big_string = "".join(my_array)

print "here is a big string:\n %s" % big_string 
def make_pi():
q、 r,t,k,m,x=1,0,1,1,3,3
尽管如此:
如果4*q+r-t

我知道这个代码可以修复工作,但我不知道该修复什么。。。
print
语句表示这里有一个大字符串和
my_array.append(str(“hello,im是数组中的一个元素”)
目前只是一个填充。我知道所有代码是如何工作的,但正如我之前所说,我无法让它写出那些代码。

我不熟悉你的算法。它是BBP的实现吗

在任何情况下,您的
make_pi
都是一个生成器。请尝试在for循环中使用它:

for digit in make_pi():
    print digit

注意,这个循环是无限的:
make_pi()
从不抛出
StopIteration

这是你想要的吗

i = 0;
pi_str = ""
for x in make_pi():
    pi_str += str(x)
    i += 1
    if i == 1001:
        break

print "pi= %s.%s" % (pi_str[0],pi_str[1:])
运行这个

def make_pi():
    q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
    for j in range(1000):
        if 4 * q + r - t < m * t:
            yield m
            q, r, t, k, m, x = 10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x
        else:
            q, r, t, k, m, x = q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2


my_array = []

for i in make_pi():
    my_array.append(str(i))

my_array = my_array[:1] + ['.'] + my_array[1:]
big_string = "".join(my_array)
print "here is a big string:\n %s" % big_string 

如果您不想实现自己的算法,可以使用


更新:代码支持较旧和较新的安装(请参阅)。*

在这里,您可以检查您的程序是否输出正确的1000位数字:

当然,你也可以使用diff或tc,但你必须从某处复制这1000个数字,然后提交你的程序并检查分数是否大于999


您可以尝试在那里打印更多的数字,从而获得更多的分数。也许您会喜欢它。

这里有一种不同的方法,我在这里找到-->根据Chudnovsky brothers公式近似python,用于生成Pi,我为我的程序对其进行了明显修改

def pifunction():
    numberofdigits = int(input("please enter the number of digits of pi that you want to generate"))
    getcontext().prec = numberofdigits

def calc(n):
    t = Decimal(0)
    pi = Decimal(0)
    deno = Decimal(0)
    k = 0
    for k in range(n):
        t = (Decimal(-1)**k)*(math.factorial(Decimal(6)*k))*(13591409+545140134*k)
        deno = math.factorial(3*k)*(math.factorial(k)**Decimal(3))*(640320**(3*k))
        pi += Decimal(t)/Decimal(deno)
    pi = pi * Decimal(12)/Decimal(640320**Decimal(1.5))
    pi = 1/pi
    return str(pi)
print(calc(1))

我希望这对您有所帮助,因为您可以生成任意数量的希望生成的pi。

沃利斯公式可以达到3.141592661439964,但需要更有效的方法来解决此问题

现在是我的代码

x, y, summing = 2, 3, 4

for count in range (0,100000000):
    summing *= (x/y)
    x += 2
    summing *= (x/y)
    y += 2

print (summing)

如评论中所述,接受的答案不正确

OP的代码似乎基于复制自的实现

要根据OP的问题修复代码(尽管我重命名了变量和函数以匹配原始源代码中的变量和函数),一种解决方案可能是:

!/usr/bin/env python
位数=1000
def pi_数字(x):
“”“生成Pi的x位。”“”
q、 r,t,k,n,l=1,0,1,1,3,3
当x>=0时:
如果4*q+r-t
此外,这里还有一个更快的*实现,显然也是基于Spigot的算法:

!/usr/bin/env python
位数=1000
def pi_数字(x):
“”“生成Pi的x位。”“”
k、 a,b,a1,b1=2,4,1,12,4
当x>0时:
p、 q,k=k*k,2*k+1,k+1
a、 b,a1,b1=a1,b1,p*a+q*a1,p*b+q*b1
d、 d1=a/b,a1/b1
当d==d1且x>0时:
收益率int(d)
x-=1
a、 a1=10*(a%b),10*(a1%b1)
d、 d1=a/b,a1/b1
数字=[str(n)表示列表中的n(pi_数字(位数))]
打印(“%s.%s\n”%(数字.pop(0),“”.join(数字)))
我对在线Pi数字发生器进行了几次测试

这一切都归功于吉斯特


*基于对10000个数字的测试,我得到了大约7秒,而不是大约1秒。

来自Fabrice Bellard站点:算法。很抱歉这么简单的实现。1000已经足够快了(对我来说是0.1秒),但10000还没有这么快-71s:-(

导入时间
从decimal导入decimal,getcontext
def计算(n):
getcontext().prec=n
res=十进制(0)
对于范围(n)中的i:
a=十进制(1)/(16**i)
b=十进制(4)/(8*i+1)
c=十进制(2)/(8*i+4)
d=十进制(1)/(8*i+5)
e=小数点(1)/(8*i+6)
r=a*(b-c-d-e)
res+=r
返回res
如果名称=“\uuuuu main\uuuuuuuu”:
t1=时间。时间()
res=计算(1000)
dt=时间。时间()-t1
打印(res)
打印(dt)

5-6年前,我用贝娄公式解决了这个问题

机械式配方

维基百科:

抱歉,代码质量太高。变量名可能没有意义

#-*- coding: utf-8 -*-

# Author:    Fatih Mert Doğancan
# Date:      02.12.2014

def arccot(x, u):
    sum = ussu = u // x
    n = 3
    sign = -1
    while 1:
        ussu = ussu // (x*x)
        term = ussu // n
        if not term:
            break
        sum += sign * term
        sign = -sign
        n += 2
    return sum

def pi(basamak):
    u = 10**(basamak+10)
    pi = 4 * (4*arccot(5,u) - arccot(239,u))
    return pi // 10**10

if __name__ == "__main__":
    print pi(1000) # 1000 

最多100万位数的pi使用(注:我是该模块的作者)

使用pip安装:

pip install math-pi
在Python中:

导入数学 >>>打印(数学pi.pi(b=1000)) 3.1415926535...
这看起来像是pi-spiget算法的一个版本,是吗?你能更清楚一点问题是什么;行为与你预期的有什么不同吗?代码看起来可疑,而且。这个问题似乎很熟悉。它以前被问过并删除过吗?相关:我有一个疯狂的想法,打开树莓pi通过让pi运行数年24/7计算出数百万个位置。此问题/答案中提供的信息似乎非常有用。感谢发布此信息。我以50000的范围运行了代码,结果完成了,但我不知道它是否准确。没有生成错误。需要弄清楚如何处理将部分结果卸载到磁盘,而不是将其保存在内存中。“对于范围内的j(1000)”使其生成的数字远少于1000位。这应该更改回“while True”或其他条件。我真的不喜欢此代码,首先-您更改“make_pi”
#-*- coding: utf-8 -*-

# Author:    Fatih Mert Doğancan
# Date:      02.12.2014

def arccot(x, u):
    sum = ussu = u // x
    n = 3
    sign = -1
    while 1:
        ussu = ussu // (x*x)
        term = ussu // n
        if not term:
            break
        sum += sign * term
        sign = -sign
        n += 2
    return sum

def pi(basamak):
    u = 10**(basamak+10)
    pi = 4 * (4*arccot(5,u) - arccot(239,u))
    return pi // 10**10

if __name__ == "__main__":
    print pi(1000) # 1000 
pip install math-pi