【问题标题】:Calculating Pi in JavaScript using Gregory-Leibniz Series使用 Gregory-Leibniz 系列在 JavaScript 中计算 Pi
【发布时间】:2020-05-15 10:37:23
【问题描述】:

我必须使用 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;
}

如何编写 pi 计算,以便计算直到 n 为止的值?

【问题讨论】:

  • 位数与级数展开数不对应。
  • 另外请注意,JavaScript 使用 floating point numbers,它不支持任意精度,因此您只能计算非常有限的位数(除非您使用高级技巧)

标签: javascript pi


【解决方案1】:

您可以使用增量 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,对,但要检查数字是一项艰巨的任务。
  • 不过,这就是 op 要求的
  • 我的数字是指系列扩展的数量,很抱歉造成混淆!我会试试那个,看看这是否有效
  • 在这种情况下,我建议只增加 1,如果您希望 n 计算系列扩展,请在计算中使用 i *4
【解决方案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 次这个数字的事实应该暗示这不是一个好方法。
  • @Carl Leth Wow 当你提到我注意到巧合 n = 7 和 10^7 迭代。它们不相关。我只是随机挑选的。 n 是用户想要的小数点后的位数,并且没有任何精度。话虽如此,你是对的,这个系列很有趣,但接近 PI 是非常痛苦的。无论如何,谁会计算 PI :)
  • 这就是我对你投反对票的原因:你随机选择了一个大数字,只是假设它足够好,而没有实际检查所需的迭代如何随着所需精度的增加而增长。在您的算法中,n 不是 Pi 中小数点后的位数,而是与 Pi 具有相同前 7 位的特定常量中的位数。
  • @Carl Leth 欢迎您投反对票,没问题。如果您在结果中引用myPI @n:100M 行,那是早期版本的代码的残留物,我在其中进行了n 提供的100M 迭代。然后在更好地阅读问题后,我将迭代次数固定为 10M 并更改 n 以反映小数点后所需的数字。我无意中放了 7,结果就像你说的数字位数与常数相同。老实说,我只是用固定的 10M 迭代实现了给定的系列,不管你叫它什么 n 值。我将其更改为 10。
猜你喜欢
  • 2019-11-03
  • 2019-12-11
  • 2023-02-05
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
相关资源
最近更新 更多