2015-08-15 39 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

相關問題