JavaScript(Node.js)中的精度小数,其中30个 我的挑战
我目前正在使用Node.js解决reddit面临的挑战,遇到了一个障碍。由于我即将完成第3天的这项练习,我决定寻求帮助。我拒绝不知道如何继续前进 挑战#6:您今天的挑战是创建一个程序,该程序可以精确计算pi,精确到小数点后至少30位。 我的障碍 我已经设法获得了我一直在寻找的精确算法,但如何获得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
/*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支持。