为什么在Gauss-Legendre算法第三次迭代后Pi的值保持不变?

时间:2020-04-03 16:55:17

标签: javascript pi

我试图用JS编写Gauss–Legendre算法。我找到了算法here

这是我写的代码:

let ao = 1;
  let bo = 1 / Math.sqrt(2);
  let to = 1 / 4;
  let po = 1;
  let an;
  let bn;
  let tn;
  let pn;
  let pi;
  for (let i = 0; i < 10; i++) {
    an = (ao + bo) / 2;
    bn = Math.sqrt(ao * bo);
    tn = to - po * Math.pow(ao - an, 2);
    pn = 2 * po;
    pi = Math.pow(an + bn, 2) / (4 * tn);
    console.log(pi.toFixed(60));
    ao = an;
    bo = bn;
    to = tn;
    po = pn;
  }

据我了解,您可以执行更多准确的迭代pi gets值。但是问题在于,在第三次迭代之后,pi的值保持不变。这是我得到的前三个值。

3.140579250522168575088244324433617293834686279296875000000000000000

3.141592646213542838751209274050779640674591064453125000000000

3.141592653589794004176383168669417500495910644531250000000000

为什么在Gauss-Legendre算法第三次迭代后Pi的值保持不变?

1 个答案:

答案 0 :(得分:1)

您的第三次迭代正确为15个有效十进制数字。在内部,Javascript将所有数字表示为64位双精度浮点数(也称为can represent 15 to 17 significant decimal digits。)。

所以我要说的结果保持不变,因为计算机根本没有更高的精度。

经过三轮迭代,收敛到计算机的(接近)最大精度真是太好了!干得好!