JavaScript(Node.js)中的精度小数,其中30个 我的挑战

JavaScript(Node.js)中的精度小数,其中30个 我的挑战,javascript,node.js,math,bigdecimal,mathjs,Javascript,Node.js,Math,Bigdecimal,Mathjs,我目前正在使用Node.js解决reddit面临的挑战,遇到了一个障碍。由于我即将完成第3天的这项练习,我决定寻求帮助。我拒绝不知道如何继续前进 挑战#6:您今天的挑战是创建一个程序,该程序可以精确计算pi,精确到小数点后至少30位。 我的障碍 我已经设法获得了我一直在寻找的精确算法,但如何获得30个小数位却让我左右为难。有人知道可以帮助我实现目标的库、解决方法或配置吗 /*jslint node: true */ "use strict"; var mathjs = require('mat

我目前正在使用Node.js解决reddit面临的挑战,遇到了一个障碍。由于我即将完成第3天的这项练习,我决定寻求帮助。我拒绝不知道如何继续前进

挑战#6:您今天的挑战是创建一个程序,该程序可以精确计算pi,精确到小数点后至少30位。

我的障碍 我已经设法获得了我一直在寻找的精确算法,但如何获得30个小数位却让我左右为难。有人知道可以帮助我实现目标的库、解决方法或配置吗

/*jslint node: true */
"use strict";

var mathjs = require('mathjs'),
  math = mathjs();

var i,
  x,
  pi;

console.log(Math.PI);

function getPi(i, x, pi) {
  if (i === undefined) {
    pi = math.eval('3 + (4/(2*3*4))');
    i = 2;
    x = 4;
    getPi(i, x, pi);
  } else {
      pi = math.eval('pi + (4/('+x+'*'+x+1+'*'+x+2+')) - (4/('+x+2+'*'+x+3+'*'+x+4+'))');
      x += 4;
      i += 1;
    if (x < 20000) {
      getPi(i, x, pi);
    } else {
      console.log(pi);
    }
  }
}

getPi();
/*jslint节点:true*/
“严格使用”;
var mathjs=require('mathjs'),
math=mathjs();
var i,
x,,
圆周率;
log(Math.PI);
函数getPi(i,x,pi){
如果(i==未定义){
pi=数学评估('3+(4/(2*3*4)));
i=2;
x=4;
getPi(i,x,pi);
}否则{
pi=math.eval('pi+(4/('+x+'*'+x+1+'*'+x+2+)-(4/('+x+2+'*'+x+3+'*'+x+4+));
x+=4;
i+=1;
如果(x<20000){
getPi(i,x,pi);
}否则{
console.log(pi);
}
}
}
getPi();
我已经完成了许多这方面的迭代,在这个例子中,我使用了Nilakatha系列:


使用一些算法来计算pi的位数,显然是任意精度。关于这个问题的评论特别指出了可能的来源。你可以很容易地将这种方法移植到JavaScript中。

如果最后一个项是4/((n-2)*(n-1)*n),即使用n-3个分数项,则该算法作为交替序列的误差约为4/n^3。要获得小于0.5*10^(-30)的错误,您需要(至少)n=2*10^10此系列的项。对于这个数字,您必须注意浮点错误,尤其是添加大数字和小数字时的取消效果。避免这种情况的最好方法是从最小的项开始求和,然后向后走。或者向前求和,但精度为60位小数,然后将结果四舍五入到30位小数

如果你想知道你到底在计算什么,最好使用更快的收敛Machin公式,或者其中一个。如果不是,那么使用一个用于数十亿位数的超快公式,但对于30位数来说,这可能是过分的


请参阅上的维基百科。

您已经阅读了以及如何配置mathjs以达到30位精度?我尝试使用
Math.PI.toFixed(30)
,但显然toFixed允许的最大位数是20No Bergi,我没有想到要这样做。好主意。我找到了小数点后30位,但不知道如何用mathjs实现此配置。我很乐意抛弃mathjs,但我仍然想学习如何配置依赖项。math.js支持bignumbers,但内置常量如
pi
仍然缺乏bignumbers支持,它们是正则数。将实现对常量的bignubmer支持。