我目前正在使用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系列:
答案 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上的维基百科。