我试图用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的值保持不变?
答案 0 :(得分:1)
您的第三次迭代正确为15个有效十进制数字。在内部,Javascript将所有数字表示为64位双精度浮点数(也称为can represent 15 to 17 significant decimal digits。)。
所以我要说的结果保持不变,因为计算机根本没有更高的精度。
经过三轮迭代,收敛到计算机的(接近)最大精度真是太好了!干得好!