使用Gregory-Leibniz级数在JavaScript中计算Pi

10

我需要使用Gregory-Leibniz级数计算出Pi的值:

pi = 4 * ((1/1 - 1/3) + (1/5 - 1/7) + (1/9 - 1/11) + ...)

我想在JavaScript中编写一个函数,该函数将以参数形式接受需要显示的数字位数。但我不确定我的思路是否正确。

这是我目前得到的:

function pi(n) {
  var pi = 0;
  for (i=1; i <= n; i+2) {
    pi = 4 * ((1/i) + (1/(i+2)))
  }
  return pi;
}

我该如何编写计算π的程序,以便它能够计算到n位小数?


5
数字的数量与级数展开的数量不相对应。 - Bergi
4
请注意,JavaScript使用浮点数(http://floating-point-gui.de/),不能支持任意精度,因此您只能计算一个非常有限的数字位数(除非您使用高级技巧)。 - Bergi
2个回答

7

您可以使用增量为 4 并在函数结尾处乘以 4

n 不是数字的数量,而是序列值的计数器。

function pi(n) {
    var v = 0;
    for (i = 1; i <= n; i += 4) {  // increment by 4
        v +=  1 / i - 1 / (i + 2); // add the value of the series
    }
    return 4 * v;                  // apply the factor at last
}

console.log(pi(1000000000));


op希望“n”代表数字的位数。 - Banana
@Banana,没错,但是检查数字是一项困难的任务。 - Nina Scholz
2
然而,这就是 OP 所问的。 - Banana
我所说的数字是指级数展开的数量,抱歉造成了混淆!我会尝试一下看看是否有效。 - Joanna
在这种情况下,我建议仅递增1,并在计算中使用“i * 4”,如果您想要“n”来计算系列扩展。 - Banana

2
你也可以按照以下方式操作;该函数将迭代10M次,并返回小数点后n位的PI值。

function getPI(n){
  var i = 1,
      p = 0;
  while (i < 50000000){
   p += 1/i - 1/(i+2);
   i += 4;
  }
  return +(4*p).toFixed(n);
}

var myPI = getPI(10);
console.log("myPI @n:100M:", myPI);
console.log("Math.PI     :", Math.PI);
console.log("The Diff    :", Math.PI-myPI);


你随意地使用10M(或50M?或100M?)作为“肯定这比你所需的更多”的数字,但是算法所需的步骤数量似乎随着所需精度的增加呈指数级增长,因此,即使将精度增加到8位数字,您发布的算法也是错误的。您至少修改了该数字3次的事实应该提示您这不是一个好方法。 - JounceCracklePop
@Carl Leth 哇,当你提到时我注意到了,巧合的是n = 7和10^7次迭代。它们没有关联。我只是随机选择了它们。n是用户想要在小数点后保留的位数,与精度无关。话虽如此,你是对的,这个级数很有趣,但接近PI非常痛苦。不管怎样,谁会计算PI呢 :) - Redu
这就是我为什么要给你点踩的原因:你随意选择了一个大数,只是假设它足够好,而没有实际检查所需迭代次数随着所需精度增加而增长的情况。在你的算法中,“n”不是Pi小数点后的位数,而是一个特定常数的位数,该常数的前7位与Pi相同。 - JounceCracklePop
@Carl Leth 没问题,欢迎您进行负面评价。如果您参考结果中的 myPI @n:100M 行,那是早期代码的残留物,当时我正在进行 1 亿次迭代,这是由 n 提供的。然后在更好地阅读问题后,我将迭代次数修正为 1000 万,并更改了 n 以反映所需的小数位数。我无意中输入了 7,结果与常数相同,就像您所说的一样。老实说,我只是使用固定的 1000 万次迭代来实现给定的级数,而不管您调用它的 n 值是什么。我会将其更改为 10。 - Redu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接