为什么在使用泰勒级数展开的pi计算中给出了java.lang.StackOverflowError?

时间:2016-09-26 12:31:42

标签: java math stack-overflow pi

作为一个学校项目,我试图使用arctan(x)的泰勒展开来计算pi的值,为arctan(1) = π/4。我制作了这个程序来计算pi的值,但我需要非常大的计数值来计算它,每当我将限值设置为超过 10000 时,比如 20000 我收到错误:

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))

我写的代码如下:

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();
    }
}

1 个答案:

答案 0 :(得分:3)

calculate()的递归调用导致StackOverflowError。

  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