0

我的挑战

我目前正在使用 Node.js 解决 reddit 的/r/dailyprogrammer挑战,但遇到了障碍。由于我已经完成了这个单一练习的第 3 天,所以我决定寻求帮助。我拒绝在不知道如何做的情况下继续前进。

挑战#6:你今天的挑战是创建一个可以精确计算圆周率的程序,至少精确到小数点后 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 系列:

尼拉喀他系列

4

2 回答 2

0

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

如果你想知道你到底在计算什么,最好使用收敛速度更快的 Machin 公式或类似 Machin 的公式之一。如果不是,则使用用于数十亿位数的超快速公式之一,但对于 30 位数,这可能是矫枉过正。

有关pi 的近似值,请参见维基百科。

于 2014-05-07T09:02:06.803 回答
0

这个问题使用一些算法来计算 pi 的数字,显然是任意精度。对该问题的评论指出了可能的来源,尤其是本文。您可以轻松地将这种方法移植到 JavaScript。

于 2014-05-06T22:27:40.840 回答