2015-08-15 59 views
4

计算圆周率的值,我试图用这个公式计算圆周率的值:不正确的答案,同时从给定的系列

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。为什么这么差?请帮助纠正我做错了什么。

+1

“但是对于n = 50,输出应为3.1415907698497954 ......”你为什么这样认为? –

+0

@ IgnacioVazquez-Abrams我看过的系列说这个。它由1501年印度数学家Kelallur Nilakantha Somayaji给出。你可以在网上查询:) – mat7

+1

不,你*可以提供链接。 *您*是提问的人。 –

回答

4

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

为了进一步解释,如果你有n=50开始,您将首先从3减去(4/(x*(x+1)*(x+2))),而不是添加到它,但如果你有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) 

你总是会得到正确的结果。

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 

是与行数更多保守:一个时间(奇值 你迭代n个反向,从而:

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)你正在计算:

enter image description here

当n的另一个值(甚至从0的值分开)你计算

enter image description here

+0

司是最慢的行动之一。如果乘以除数,然后像OP那样做一个单独的除法操作,不是更好吗? – SethMMorton

+0

@SethMMorton:是的划分确实很慢。但我不认为我们对这里的速度感到担忧。如果我们关心速度,我们甚至不会考虑“计算”pi。我们将使用math.pi ...这正是我编写CPU Hogging代码时想要编写的方式。 – knsn1994