我正在try 使用Gauss-Legendre算法将圆周率计算到大量的小数位,如下所示

enter image description here

然而,它只返回大约15位圆周率.显然,这是因为在Java脚本中的数学运算是使用64位浮点值执行的,而16位精度正好达到了它们可以准确表示的极限.

这是我的代码

let a = 1,
    b = 1 / Math.sqrt(2),
    t = 1 / 4,
    p = 1;

let i = 0;
while (a - b < 3) {
    i++;

    let an = (a + b) / 2;
    b = Math.sqrt(a * b);
    t = t - p * (a - an) ** 2;
    p = 2 * p;

    a = an;

    if (i == 100) break;
    let pi = (a + b) ** 2 / (4 * t);
    console.log(pi);
}

我想知道有没有什么办法可以让javascript返回更多位的圆周率. 提前谢谢你

推荐答案

以下是使用Decimal.js的解释,所需精度为150位圆周率……(请注意,"运行代码片段"的"整页"模式可以更好地审查结果.)

<script src="https://cdnjs.cloudflare.com/ajax/libs/decimal.js/10.4.2/decimal.min.js"></script>

<script>

desiredPiDigits = 150;
Decimal.precision = desiredPiDigits + 5;

let desiredPiPrecision = new Decimal( 1 ).div( 10 ** desiredPiDigits );
let maxIterations = 50;

let a = new Decimal( 1 ),
    b = new Decimal( 1 ).div( Decimal.sqrt( 2 ) ),
    t = new Decimal( 0.25 ),
    p = new Decimal( 1 );

let i = maxIterations;
while ( desiredPiPrecision.lt( a.sub( b ).abs() ) ) {

    let an = a.add( b ).div( 2 );
    b = a.mul( b ).sqrt();
    t = t.sub( p.mul( a.sub( an ).pow( 2 ) ) );
    p = p.mul( 2 );

    a = an;

    let pi = a.add( b ).pow( 2 ).div( t.mul( 4 ) );
    console.log( pi.toString().slice( 0, desiredPiDigits + 1 ) );
    
    if (--i === 0) break;
}

</script>

Javascript相关问答推荐

Klaro与Angular的集成

Google Apps脚本中的discord邀请API响应的日期解析问题

将状态向下传递给映射的子元素

google docs boldText直到按行执行应用脚本错误

在使用HighChats时如何避免Datatables重新初始化错误?

JS:XML insertBefore插入元素

类构造函数忽略Reaction Native中的可选字段,但在浏览器中按预期工作

当我try 将值更改为True时,按钮不会锁定

Reaction-SWR-无更新组件

使用Document.Evaluate() Select 一个包含撇号的HTML元素

处理app.param()中的多个参数

重新呈现-react -筛选数据过多

如何在TransformControls模式下只保留箭头进行翻译?

有没有办法在R中创建一张具有多个色标的热图?

更新文本区域行号

当达到高度限制时,如何裁剪图像?使用html和css

不允许在对象文本中注释掉的属性

如何在css中裁剪成一定Angular 的圆的一部分,而不需要复杂的多边形

ReactJS Sweep Line:优化SciChartJS性能,重用wasmContext进行多图表渲染

JAVASCRIPT|导入模块中断FOR循环