1

根据印度数学家 Srinivasa Ramanujan 找到的公式编写一个函数estimatePi()来估计并返回 Pi 的值。它应该使用 while 循环来计算总和的项,直到最后一项小于 1e-15。估计 Pi 的公式如下: 根据 Ramanujam 的估计

(对不起,我无法上传图片)

def estimatePi():
import math
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)
k=0
final=0
pi=0
while pi<1e-15:
    a=factorial(4*k)
    b=(1103+26390*k)
    c=factorial(k)
    d=c**4
    e=396**(4*k)
    f=2*math.sqrt(2)/9801
    final+=(a*b*f)/(d*e)
    k+=1
    pi=1/final
return pi

而且,我的问题是: 预期答案是 =3.14159265359 我的答案是 =3.14159273001

我找不到我的错:(。有人可以帮我解决这个问题吗?

4

5 回答 5

3

我的朋友,您的代码有几处有问题。首先,在您的代码中,请记住变量 pi 的任何形状或形式都不等于 final。您正在计算一个不会迭代的 while 循环,因为 pi 显然比 1e-15 更大。所以简单地说,你的代码只是在 k=0 处计算你的公式,然后它就停止了。因此,这是一种可能的方法:

    def estimatePi():
        import math
        def factorial(n):
            if n == 0:
                return 1
            else:
                return math.factorial(n)
        k=1  # we want it at k=1 not 0 since we already have k=0 as Final
        Final=0.31830987844  #this is the value at k=0, the first value
        while Final>1e-15:   """ Note that 1e-15 is the limiting value and we want all b values that are less than 1e-15. k=2 is the final k value where b has the last smaller number than 1e-15.""" 

            b=(2*math.sqrt(2)/9801)*(factorial(4*k)*(1103+26390*k))/((factorial(k)**4)*(396**(4*k)))

            Final=Final+b
            k=k+1
            return 1/Final
   print estimatePi()
#This gives you the number you are looking for ---3.14159265359.
于 2015-12-26T03:12:41.147 回答
1

你的回答是正确的。浮点数存在精度问题,尤其是小数点后的位数较多;以及计算非精确值时。

从您的回答中可以看出,它已经正确估计了小数点后 5 位的 pi 值。

于 2012-08-09T09:32:25.957 回答
1

这是我的代码。它返回与要求相同的结果:

    import math
    def factorial(n): 
        if n == 0:
            return 1
        else:
            return n * factorial(n-1) 
    def estimatePi():
        f=2*math.sqrt(2)/9801
        k=0
        RHS = 0
        while True:
            num = factorial(4*k)*(1103+26390*k)
            den = (factorial(k))**4 * 396**(4*k)
            a = f*num/den
            RHS += a
            if a < 1e-15: break 
            k+=1
        return 1/RHS
于 2016-12-04T01:54:09.140 回答
0
import math
def factorial(n):
if n == 0:
    return 1
else:
    return n * factorial(n-1)
def series_term(k):
a=factorial(4*k)
b=(1103+26390*k)
c=factorial(k)
d=c**4
e=396**(4*k)
return float(a*b)/(d*e)
def estimatePi():
k=0
final=0
while True:
    term = series_term(k)
    final += term
    if term < 1.0e-15:
        break
    else:
        k += 1
f=2*math.sqrt(2)/9801 
pi = 1.0/(final * f)
return pi
于 2012-08-10T03:47:01.067 回答
0

您遇到的问题不在于您的代码,而在于您对所提出问题的理解。问题指出:

它应该使用 while 循环来计算总和的项,直到最后一项小于 1e-15。

使变量等于 1,将 while 循环的条件更改为 read:while variable>=1e-15:并在 while 循环中,将变量设置为等于 SUMMATION 的 LAST TERM。这应该会给你一个更准确的值。对于它的价值,这会产生正确的值,但pyschools仍然没有通过我的代码。

于 2013-10-14T18:22:15.330 回答