Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用我书中的数列计算π_Python - Fatal编程技术网

Python 用我书中的数列计算π

Python 用我书中的数列计算π,python,Python,我正在尝试(再次)提高编程水平,这次是用python,我遇到了一个障碍。我一直在试图弄明白为什么这在一段时间内不起作用,所以如果我能得到一些帮助,那将是非常非常棒的。我把这些说明作为评论,但是这个系列不会复制成文本,尽管它在维基百科上也有 当我说1000000时,它给了我5.80825432026;这个值变化不大。不管怎样,有人能帮我吗?在这一点上,我想不出还有什么别的办法。为什么你的射程从-3开始?您的函数在范围(1,p*4,4)下运行良好,尽管p不是术语数。起点错误。使用合理的变量名(问题是

我正在尝试(再次)提高编程水平,这次是用python,我遇到了一个障碍。我一直在试图弄明白为什么这在一段时间内不起作用,所以如果我能得到一些帮助,那将是非常非常棒的。我把这些说明作为评论,但是这个系列不会复制成文本,尽管它在维基百科上也有


当我说1000000时,它给了我5.80825432026;这个值变化不大。不管怎样,有人能帮我吗?在这一点上,我想不出还有什么别的办法。

为什么你的射程从-3开始?您的函数在
范围(1,p*4,4)
下运行良好,尽管
p
不是术语数。

起点错误。使用合理的变量名(问题是n,所以使用n,而不是p)。检查上限。。。要获得n个术语,您需要进行(n//2)次迭代,您需要进行大约n次迭代

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

根据引用的维基百科页面,我将采用以下实施方式:

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()))

一般来说,对于浮点数学来说,最好先将最小的项相加,以最小化舍入误差,因此我建议对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

我试图实现的系列中的第一个术语是1;我想我必须使用-3才能得到第一个数字1。我现在明白了,我不需要这么做。非常感谢你。我不知道我该怎么做才能让p成为术语的数量,我相信它是现在的两倍?所以范围(-3,p*2,4):可以解决问题,但只能解决一半的问题。该死的,我也不知道该怎么做!您只需在交互式Python提示符中键入
range(a、b、c)
即可查看它的功能。我注意到你对
-3
滑回的范围的修正;多亏了你的帮助,我学会了仅仅通过调用函数来设置函数中的变量是多么容易,这在我的书中是没有提到的。我还学会了这个技巧。但我在每一个我能理解的答案中都发现了一个问题,那就是这不是用正确数量的术语计算的;它们的数量总是应该的两倍。不过,我不知道如何将其更改为那样工作。看起来它简化为:
def pi(n):为xrange(1,n*4,4)中的I返回8*sum(1.0/(I*(I+2))
@caleb:已经告诉您问题是什么:“要获得n个术语,您需要进行(n//2)次迭代,您正在进行大约n次迭代。”尝试使用
n*2
而不是
n*4
作为上限。这将使您接近所需的数字:-)
>>> 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