📜  在 java 中计算 pi(1)

📅  最后修改于: 2023-12-03 14:50:56.729000             🧑  作者: Mango

在 Java 中计算 π

计算圆周率 π 是计算机科学领域中的一个经典问题。本文介绍如何在 Java 中计算π。

算法简介

常见的计算π的算法有 Monte Carlo 方法、Chudnovsky 方法等。本文介绍的是 Leibniz π/4 公式。该公式可以写作:

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

该公式等价于:

$$ \pi = 4 \cdot \sum_{i=0}^n \frac{(-1)^i}{2i + 1} $$

其中,当 $n \rightarrow \infty$ 时,上式的和逼近π。

在 Java 中,可以使用 BigDecimal 类来计算π,由于 BigDecimal 采用的是高精度计算,因此可以保证计算结果的准确性。

Java 代码实现

以下是 Java 代码实现,在控制台输出 π 的值:

import java.math.BigDecimal;

public class ComputePi {
    public static void main(String[] args) {
        int n = 100000; // 计算前 100000 项
        BigDecimal sum = new BigDecimal(0);
        for (int i = 0; i < n; i++) {
            BigDecimal numerator = new BigDecimal(-1).pow(i);
            BigDecimal denominator = new BigDecimal(2).multiply(new BigDecimal(i)).add(new BigDecimal(1));
            BigDecimal term = numerator.divide(denominator, 10000, BigDecimal.ROUND_HALF_UP);
            sum = sum.add(term);
        }
        BigDecimal pi = sum.multiply(new BigDecimal(4));
        System.out.println(pi.toString());
    }
}
代码解释

以上代码中的核心部分为 for 循环,计算前 n 项的和:

BigDecimal sum = new BigDecimal(0);
for (int i = 0; i < n; i++) {
    BigDecimal numerator = new BigDecimal(-1).pow(i);
    BigDecimal denominator = new BigDecimal(2).multiply(new BigDecimal(i)).add(new BigDecimal(1));
    BigDecimal term = numerator.divide(denominator, 10000, BigDecimal.ROUND_HALF_UP);
    sum = sum.add(term);
}

其中,numerator 表示分子,denominator 表示分母,term 表示当前项的值。需要注意的是,numeratordenominator 均为 BigDecimal 类型,因此需要使用 BigDecimal 提供的运算符进行计算。

在代码中,numerator 的值为 $(-1)^i$,denominator 的值为 $2i+1$,term 的值为 $(-1)^i/(2i+1)$。

在计算 term 时,需要指定小数位数为 10000,这可以保证计算结果的精确性。

计算出前 n 项的和之后,需要乘以 4,即可得到π的值。

BigDecimal pi = sum.multiply(new BigDecimal(4));
System.out.println(pi.toString());
运行结果

运行以上代码,控制台将输出π的值:

3.1415826535...

由于 BigDecimal 类采用的是高精度计算,因此计算结果的精度可以根据需求进行调整。

参考文献