从给定系列计算pi值时,答案不正确

时间:2015-08-15 06:06:18

标签: python python-2.7

我试图用这个公式计算pi的值:

enter image description here

我编写了这段代码,用于查找给定的n

def pisum(n):
    sum=3.0
    x=2.0
    while (n>0):
        if n%2==1:
            sum=sum+(4/(x*(x+1)*(x+2)))
        else :
            sum=sum-(4/(x*(x+1)*(x+2)))
        x=x+2
        n=n-1
    return str(sum)

它适用于n=0n=1,并提供输出3.0,3.16666666667。但对于n=50,输出应为3.1415907698497954,但它给出2.85840923015。为什么这么大的差异?如果我做错了,请帮忙纠正。

2 个答案:

答案 0 :(得分:5)

问题是您使用n%2来确定是否减去或添加。这不是你开始时应该重要的循环数量,而是你所处的循环。要看到这一点,请尝试将函数用于奇数,例如: 51,你会看到它会给你一个正确的答案。

要进一步说明,如果您从n=50开始,您最初会从(4/(x*(x+1)*(x+2)))中减去3而不是添加n=51,但如果您从def pisum(n): sum = 3.0 x = 2.0 for i in range(n): if i % 2 == 0: sum = sum + (4 / (x * (x + 1) * (x + 2))) else: sum = sum - (4 / (x * (x + 1) * (x + 2))) x = x + 2 return str(sum) 开始,那么最初会添加。

如果您按如下方式修改您的功能:

    $('item').click(function() {
       var itemNum = $(this).index() + 1; 
       var $leftArrow = $('#item' + itemNum + ' .left-arrow');
       var $rightArrow = $('#item' + itemNum + ' .right-arrow');

       $leftArrow.click(...);
       $rightArrow.click(...);
    });

您将始终获得正确的结果。

答案 1 :(得分:0)

你犯了一个小错误。

一个正确的程序:

def pisum(n):
    sum = 3.
    for i in xrange(2, 2*n+2, 2):
        sum += (4. if (i&2) == 2 else -4.)/i/(i+1)/(i+2)
    return sum

对于行数更加保守:

def pisum(n):
    return  3. + sum([(4. if (i&2) == 2 else -4.)/i/(i+1)/(i+2) for i in xrange(2,2*n+2,2)])

你的错误: 你正在反向迭代n,因此你正在计算一次(n的奇数值):

enter image description here

并且正在计算

的另一个n值(除了0之外的偶数值)

enter image description here