我正在尝试(再次)在编程方面做得更好,这次是在python中,我遇到了障碍。我一直试图弄清楚为什么现在这种情况不起作用,所以如果我能得到一些非常非常好的帮助。我有说明作为评论,但系列不会复制到文本,它在维基百科上虽然http://en.wikipedia.org/wiki/Pi#Estimating_.CF.80
#19. Write a program that approximates the value of pi by summing the terms of this series:
#The program should prompt the user for n, the number of terms to sum
# and then output the sum of the first n terms of this series.
def pi() :
n = 0.0
p = input()
for i in range(-3,p*4,4):
n = n + 4.0 / i - 4.0 / ( i + 2)
print n
当我说1000000时,它给了我5.80825432026;这个价值变化不大。无论如何,有人可以帮助我吗?在这一点上,我没有别的想法。
答案 0 :(得分:3)
错误的起点。使用合理的变量名称(问题是n,所以使用n,而不是p)。检查上限...得到你需要做的n个项(n // 2)迭代,你正在做大约迭代。
>>> def pi(n):
... tot = 0.0
... for i in xrange(1, n * 4, 4):
... tot += 4.0 / i - 4.0 / (i + 2)
... return tot
...
>>> pi(1000)
3.1410926536210386
>>> pi(10000)
3.1415426535898203
>>> pi(100000)
3.141587653589818
>>>
答案 1 :(得分:1)
为什么你的范围从-3开始?虽然range(1,p*4,4)
不是术语数,但您的功能可以与p
一起使用。
答案 2 :(得分:0)
根据引用的维基百科页面,我会采用这种方式:
def pi(p) :
def powers():
while True:
yield 1.0
yield -1.0
return 4.0 * sum(p / i for i, p in zip(range(1,2*p+1,2), powers()))
答案 3 :(得分:0)
一般来说,对于浮点数学,最好先将最小的项加起来以最小化舍入误差,所以我建议对John Machin的答案进行微小的修改
>>> def pi(n):
... tot = 0.0
... for i in reversed(xrange(1, n * 4, 4)):
... tot += 4.0 / i - 4.0 / (i + 2)
... return tot