【问题标题】:Precision decimals, 30 of them, in JavaScript (Node.js)JavaScript (Node.js) 中的精度小数,其中 30 个
【发布时间】:2014-05-06 19:57:03
【问题描述】:

我的挑战

我目前正在使用 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 系列:

【问题讨论】:

  • 您已阅读 bignumber documentation 以及如何配置 mathjs 以实现 30 位精度?
  • 我尝试使用Math.PI.toFixed(30),但显然 toFixed 允许的最大位数是 20
  • 不,Bergi,我没想过要这么做。好主意。
  • 我找到了DECIMAL_PLACES : 30option,但我不知道如何用 mathjs 实现这个配置。我很乐意扔掉 mathjs,但我仍然想学习如何配置依赖项。
  • math.js 支持 bignumbers,但是像 pi 这样的内置常量仍然缺乏 bignumber 支持,它们是常规 Numbers。将实现对常量的 bignubmer 支持。

标签: javascript node.js math bigdecimal mathjs


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这个算法,作为一个交替序列,如果最后一项是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 上的维基百科。

    【讨论】:

      猜你喜欢
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多