使用我书中的系列计算pi

时间:2010-11-13 23:13:16

标签: python

我正在尝试(再次)在编程方面做得更好,这次是在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;这个价值变化不大。无论如何,有人可以帮助我吗?在这一点上,我没有别的想法。

4 个答案:

答案 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