2013-10-14 33 views
0

我試圖用萊布尼茲系列和我得到的問題approoximate pi是:萊布尼茨系列的Java

pi = 4(1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ((-1)^i+1)/2i - 1 

「您可以通過以下一系列近似π

編寫一個程序,顯示i = 10,000,20,000,...的π值爲100,000「

現在這個問題本身是相當含糊的,這主要是我想要的幫助,到目前爲止我已經到了這裏。

public class Q2 { 

public static void main(String[] args) 
{ 
    for (int i = 1; i <= 10000; i++) 
    { 
     double pi = 4* (1 - (1/3) + (1/5) - (1/7) + (1/9) - (1/11) + 
       (Math.pow((-1),(i+1)))/((2*i)-1)); 

     if(i%10000==0) 
     { 
      System.out.println(); 
     } 
    } 
} 

} 

的問題是,在運行時系統產生任何結果,如果有額外的else語句跑去檢查pi的vallue它給回的變化對4.000200030004501和3.999799949987497。

if(i%10000==0) 
{ 
System.out.println(); 
} 
else 
{ 
System.out.print(pi); 
} 

我補充說錯了嗎?我感覺自己像是在盯着我臉上的問題,而我錯過了! 謝謝, Dave。

+1

這個問題似乎被問大約每週一次。如果要分割兩個數字,而不是四捨五入爲整數,則其中一個必須是非整數類型。例如,1.0/3,而不是1/3。看看http://stackoverflow.com/questions/13668007/odd-behaviors-when-dividing-doubles-in-java。 –

+0

執行Math.pow()調用也不是嚴格必要的 - 這是一個方便的數學表示法來捕獲交替符號,但檢查我是偶數還是奇數,並且翻轉該術語的符號效率更高如有必要。 –

回答

3

你誤解了問題中的系列。他們的意思是,該系列的第i個元素由下式給出:

((-1)^i+1)/(2i - 1) [i starting with 1 in this notation] 

因此該系列直到元素2:

4 * (-1^(1+1)/(2*1-1) + -1^(2+1)/(2*2-1) ) = 4*(1 - 1/3) 

這樣的問題列出了1號6個要素系列,但系列的長度是無限的。這意味着,對我(TARGET)的給定值計算會是什麼樣子:

double sum = 0; 
for (int i=1; i<TARGET; i++) { 
    double element = Math.pow(-1,i+1)/(2*i + 1); //element i 
    sum += element; // add element i to the results so far 
} 
double result = 4*sum; 

看到wikipedia這一系列的更多細節描述(注意,維基百科的文章開始在我計數= 0)

+0

我一直在想,感謝一百萬人的幫助。我沒有聲望投票答覆你的答案,但一旦我做了,我一定會回來投票。 – Dobhaweim

0

不知道這個問題是否仍然相關,但可能的答案可能是喜歡它

public class Calculate_PI 
{ 
    public static void main(String[] args) 
    { 
    double pi = 0;  

    for(int i = 10_000; i <= 100_000; i += 10_000) 
    { 
     double variablePart = 0; 
     for(int j = 1; j <= i; j++) 
     { 
      variablePart += (Math.pow(-1, j+1)/((2 * j) - 1)); 
     } 
     pi = 4 * variablePart; 
     System.out.printf("For i = %d\npi = %12.9f\n", i,pi); 
    } 
    } 
}