使用Java使用Taylor系列计算pi的项

时间:2016-05-16 21:20:46

标签: java pi

我正在尝试使用泰勒系列计算Pi的术语。我想继续添加术语,直到术语的最后一个值小于1e-17。我已经在term = 31设置了程序,因为之后没有变化Pi = 3.141592653589794 error = 8.88178e - 16.

public static double compPi()
    {
        int terms1 = 31;
        int sg = 1, denom1 = 1;
        double sum = 1.0, denom2 = 1.0;
        for (int t = 2; t <= terms1; t++){
            denom1 += 2; denom2 *= 3;
            double term = 1.0/ (denom1 * denom2);
            sg *= -1;
            sum += sg * term;
        }
        double pi = Math.sqrt(12) * sum;
        return pi;
    }

2 个答案:

答案 0 :(得分:0)

正如Louis Wasserman所说,你在Java中遇到双精度限制。考虑使用BigDecimals进行计算以获得更高的精度。

答案 1 :(得分:0)

总和中的浮点误差加起来就是这个差异,只需反转你的迭代(t = 31..2,即首先将非常小的加数加起来),然后错误就消失了:

public static double compPiReversed()
{
    int terms1 = 31;
    int sg = -1;
    double sum = 0;
    for (int t = terms1; t >= 2; --t) {
        int denom1 = 1 + (t-1) * 2;
        double denom2 = Math.pow(3, t-1);
        double term = 1.0 / (denom1 * denom2);
        sg *= -1;
        sum += sg * term;
    }
    sum += 1;
    double pi = Math.sqrt(12) * sum;
    return pi;
}

第31次加数再次实际上没有贡献(尝试从terms1 = 30开始,不要忘记更改符号sg = 1。)