2016-09-26 62 views
2

作爲一個學校項目,我試圖使用泰勒擴展arctan(x)來計算pi的值,如arctan(1) = π/4。我做了這個程序計算圓周率的值,但我需要算的非常大的值來計算的話,每當我把限制超過價值,說我得到的錯誤:爲什麼在使用泰勒級數展開的pi計算中給出java.lang.StackOverflowError?

Exception in thread "main" java.lang.StackOverflowError 
at extended_essay.Talyor_pi_arctan.calculate(Talyor_pi_arctan.java:18) 

The line "at extended_essay.Talyor_pi_arctan.calculate(Talyor_pi_arctan.java:18)" 

重複多次。

我不想處理異常,因爲這會增加所需的時間。 請告訴我爲什麼會發生這種情況,我還可以使用其他可能的解決方案?

附加信息:

the taylor expansion of arctan(x) is 

Summation of (((-1)^n)/2n+1) * ((x)^(2n+1)) 

我寫的代碼如下:calculate()事業的StackOverflowError的

public class Talyor_pi_arctan { 
    static double count = 0, val = 0, pi = 0, limit = 10000; 
    public static void main(String args[]){ 
     calculate(); 
     pi *= 4; 
     System.out.println("Value of pi calculated: " +pi); 
     System.out.println("Actual value of pi : " +Math.PI); 
    } 
    public static void calculate(){ 
     if(count >= limit){ 
      return; 
     } 
     val = (Math.pow(-1d, count)/((2 * count) + 1)) * Math.pow(1, ((2*count)+1)); 
     pi = pi + val; 
     ++count; 
     calculate(); 
    } 
} 
+7

不必要的遞歸生產許多棧幀,導致堆棧溢出,只是把它變成一個循環 –

+0

有在你的代碼中遞歸,它可能會導致stackoverflow例外 – Venkat

+1

請注意,這個近似值的誤差是'1 /(2n + 1)'與'n'項的總和。查找「Machin-like公式」,以便更快地收斂arcus切線公式的組合。 – LutzL

回答

3

遞歸調用。

  1. 您可以計算循環,而不是遞歸計算。

    for (int i = 0; i < termsNumber; i++) { 
        result += f(i) 
    } 
    
  2. 根據您真正需要的準確度,您可以將限制設置爲10000。

  3. Math.pow(-1d, count)是計算的好方法,使用

    count % 2 == 0 ? 1d : -1d 
    
  4. Math.pow(1, ((2*count)+1) == 1