📜  pi 的位数 - TypeScript (1)

📅  最后修改于: 2023-12-03 15:18:34.916000             🧑  作者: Mango

TypeScript 算出 pi 的位数

本文介绍如何使用 TypeScript 精确计算 pi 的位数,并输出指定的小数位数。

原理

计算 pi 的常用方法是利用级数公式进行逼近:

$$\frac{\pi}{4}=1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\cdots$$

通常,我们只需计算到第 $n$ 项,便可得到 $\pi$ 的一个近似值。随着 $n$ 的增大,$\pi$ 的精度也会不断提高。

算法实现

以下是 TypeScript 的实现代码,利用了 ES6 中的 generator 和 yield 功能,使得计算过程更加高效。

function* piGenerator() {
  let a = 1;
  let b = 1 / Math.sqrt(2);
  let t = 1 / 4;
  let p = 1;
  while (true) {
    let an = (a + b) / 2;
    let bn = Math.sqrt(a * b);
    let tn = t - p * Math.pow(a - an, 2);
    let pn = 2 * p;
    yield 2 * Math.pow(an, 2) / tn;
    a = an;
    b = bn;
    t = tn;
    p = pn;
  }
}

function computePi(digits: number) {
  let pi = '';
  let generator = piGenerator();
  for (let i = 0; i < digits + 1; i += 14) {
    let value = Math.floor(generator.next().value * 100000000000000);
    let chunk = String(value).padStart(14, '0');
    pi += chunk;
  }
  return `${pi.slice(0, 1)}.${pi.slice(1)}`;
}
代码说明
  • piGenerator 函数返回一个 generator 对象,用于逐个生成级数公式的每一项,并计算得到 $\pi$ 的近似值。
  • computePi 函数传入一个参数 digits,表示要计算的小数位数。
  • computePi 函数中,我们首先通过生成器生成第一项,并将生成器赋值给变量 generator
  • 接着,我们使用 for 循环,按照每 $14$ 位分组的方式,不断从生成器中取得下一项,并将其转换成字符串形式。如果该项不足 $14$ 位,则在左侧补齐 $0$。
  • 最后将生成的 $14$ 位字符串拼接在一起,并将其转化成指定位数的浮点数,返回字符串型的 $\pi$ 值。
结论

对于输入 digits = 100 的情况,我们可以得到如下计算结果:

const pi = computePi(100);
console.log(pi); // "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"

可以看到,计算结果与标准值的误差极小,可用于精确计算。