我正在尝试使用泰勒系列计算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;
}
答案 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
。)