根据印度数学家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
我无法找到我的错:(。有人可以为我帮忙吗?
答案 0 :(得分: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.
答案 1 :(得分:1)
你回答是对的。浮点数具有problems with accuracy,尤其是小数点后的大量数字;并在计算非精确值时。
您可以从答案中看到它已经正确估计了小数点后5位数的pi值。
答案 2 :(得分: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
答案 3 :(得分:0)
您遇到的问题不在于您的代码,而在于您对所提问题的理解。问题是:
它应该使用while循环来计算求和项,直到最后一个项小于1e-15。
使变量等于1,将while循环的条件更改为:while variable>=1e-15:
,并在while循环中,将变量设置为SUMMATION的最后一个。这应该会给你一个更准确的价值。对于它的价值,这会生成正确的值,但pyschools
仍未传递我的代码。