JavaScript中的精确小数,其中30个(Node.js)

时间:2014-05-06 19:57:03

标签: javascript node.js math bigdecimal mathjs

我的挑战

我目前正在使用Node.js通过reddit的/r/dailyprogrammer挑战,并抓住了一个障碍。由于我通过这一次练习完成了第3天,我决定寻求帮助。我不知道如何继续前进。

  

挑战#6:您今天面临的挑战是创建一个程序,可以准确计算pi至少30个小数位。

我的障碍

我设法通过mathjs获得了我正在寻找的精确算术,但是我仍然难以获得如何获得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();

我已经完成了很多这方面的工作,在这个例子中我使用的是Nilakatha系列:

Nilakatha Series

2 个答案:

答案 0 :(得分:0)

This question使用一些算法计算pi的数字,显然是任意精度。对该问题的评论表明可能的来源,特别是this paper。您可以轻松地将该方法移植到JavaScript。

答案 1 :(得分:0)

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

如果你想知道你究竟在计算什么,最好使用更快收敛的Machin公式,或Machin-like formulas之一。如果没有,那么使用一个用于数十亿位的超快速公式,但对于30位数,这可能是过度的。

请参阅approximations of pi上的维基百科。