计算π到n位数

2024-05-17 19:32:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试通过做各种小项目来学习python,在本例中,输入一个数字,pi将计算到该数字输入。在谷歌搜索的帮助下,我能够计算出圆周率,但是不管我输入什么数字,它仍然会产生相同数量的圆周率。

我有点搞不清是什么原因造成的,任何提示都会非常感谢,提前谢谢。这是Python2.7上的

from math import factorial
from decimal import Decimal, getcontext
# Chudnovsky algorithm for figuring out pi
getcontext().prec=100

pi_input = input('How many digits of pi would you like?')
n = int(pi_input)

def calc(n):
    t= Decimal(0)
    pi = Decimal(0)
    deno= Decimal(0)

    for k in range(n):
        t = ((-1)**k)*(factorial(6*k))*(13591409+545140134*k)
        deno = factorial(3*k)*(factorial(k)**3)*(640320**(3*k))
        pi += Decimal(t)/Decimal(deno)
    pi = pi * Decimal(12) / Decimal(640320 ** Decimal(1.5))
    pi = 1/pi
    return pi

print calc(n)

这是我的输出

How many digits of pi would you like? 5 

3.1415926535897932384626433832795284197169399375105820974944592307816346 9469024771726816523915601


Tags: offromimportforinputpi数字many
3条回答

可以使用"%.nf"格式化输出字符串,其中n是要输出的位数。 e、 g

import numpy as np
print "%.5f"%(np.pi)

我刚刚在您的代码和hope的return语句中添加了round函数,它对您和我一样有效。

from math import factorial
from decimal import Decimal, getcontext
# Chudnovsky algorithm for figuring out pi
getcontext().prec=1000

pi_input = input('How many digits of pi would you like?')
n = int(pi_input)

def cal(n):
    t= Decimal(0)
    pi = Decimal(0)
    deno= Decimal(0)

    for k in range(n):
        t = ((-1)**k)*(factorial(6*k))*(13591409+545140134*k)
        deno = factorial(3*k)*(factorial(k)**3)*(640320**(3*k))
        pi += Decimal(t)/Decimal(deno)
    pi = pi * Decimal(12) / Decimal(640320 ** Decimal(1.5))
    pi = 1/pi
    return round(pi,n)

print(cal(n))

使用Chudnovsky算法,计算每次迭代产生大约14.18个十进制数字:log10((640320^3)/(24*6*2*6))~=14.18。这在ak/ak-1的公式中可以更清楚地看到,如本网页所示:

https://www.craig-wood.com/nick/articles/pi-chudnovsky

对于n=5,结果的精度约为70位。

相关问题 更多 >