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();
}
}
不必要的遞歸生產許多棧幀,導致堆棧溢出,只是把它變成一個循環 –
有在你的代碼中遞歸,它可能會導致stackoverflow例外 – Venkat
請注意,這個近似值的誤差是'1 /(2n + 1)'與'n'項的總和。查找「Machin-like公式」,以便更快地收斂arcus切線公式的組合。 – LutzL