如何只计算Pi的第n个数字?

时间:2018-08-31 07:53:03

标签: java math

我在Pi的第n位使用BBP公式。正常的BBP公式为Pi的一定位数计算Pi。我正在尝试获得Pi的一位数字的值。 Wikipedia BBP公式网站上有关于如何获取Pi的第n位数字的部分。本部分是此link。因此,我用Java编写了一个程序,使用对BBP公式的解释来计算Pi的第n位数字,这就是这张图片:

Formula

这是我的Java程序的代码。如果我的公式或Java代码在计算Pi的n位数字时出错,请告诉我,因为我没有得到正确的答案。例如)

Which decimal digit of Pi do you want? 1
3.0024718637216376E116
C:\Users\matth\Documents>java NthDigitOfPi
Which decimal digit of Pi do you want? 2
9.224189345124711E114
import java.io.Console;
public class NthDigitOfPi {
    public static void main(String[] args) {
        System.out.print("Which decimal digit of Pi do you want? ");
        String line = System.console().readLine();
        double n = Double.parseDouble(line);
        double y = 0.0;
        for (double k = 0; k <= n; k++) {
            y = y + ((Math.pow(16, (n - k))) % (8 * k + 1)) / (8 * k + 1);
        }
        double z = 0;
        for (double k = (n + 1); k <= 100; k++) {
            z = z + ((Math.pow(16, (100 - k))) / ((8 * k) + 1));
        }
        y = y + z;
        y = 4 * y;

        double y2 = 0;
        for (double k = 0; k <= n; k++) {
            y2 = y2 + ((Math.pow(16, (n - k))) % (8 * k + 4)) / (8 * k + 4);
        }
        z = 0;
        for (double k = (n + 1); k <= 100; k++) {
            z = z + ((Math.pow(16, (100 - k))) / ((8 * k) + 4));
        }
        y2 = y2 + z;
        y2 = 2 * y2;
        y = y - y2;

        double y3 = 0;
        for (double k = 0; k <= n; k++) {
            y3 = y3 + ((Math.pow(16, (n - k))) % (8 * k + 5)) / (8 * k + 5);
        }
        z = 0;
        for (double k = (n + 1); k <= 100; k++) {
            z = z + ((Math.pow(16, (100 - k))) / ((8 * k) + 5));
        }
        y3 = y3 + z;
        y = y - y3;

        double y4 = 0;
        for (double k = 0; k <= n; k++) {
            y4 = y4 + ((Math.pow(16, (n - k))) % (8 * k + 6)) / (8 * k + 6);
        }
        z = 0;
        for (double k = (n + 1); k <= 100; k++) {
            z = z + ((Math.pow(16, (100 - k))) / ((8 * k) + 1));
        }
        y4 = y4 + z;
        y = y - y4;

        System.out.print(y);
    }
}

3 个答案:

答案 0 :(得分:2)

这不是您问题的直接答案,也不是代码中问题的解决方案,但是在Java中用Pi获得nth数字的一种实用方法是仅对字符串Math.PI进行子处理:

public char nPi(int index) {
    if (index < 0 || index > 15) return '';

    String pi = String.valueOf(Math.PI).replace(".", "");
    char nDigit = pi.charAt(index);

    return nDigit;
}

注意:这会将PI限制在16位左右。但是,除非您要进行一些非常精确的数学运算,否则此选项可能对您有用。

答案 1 :(得分:0)

您需要结合使用@tim Biegeleisen的程序和此程序。首先,您需要计算所需的pi位数,因此请使用此线程中的信息:Calculating Pi Java Program

该公式不是“简单的”,因此我不会从线程中复制任何代码,您可以自己查看。

一旦使用了它们的计算方式,就使用

String pi = String.valueOf([picalcs]).replace(".", "");
char nDigit = pi.charAt(index);

,其中pi的计算包含在代码的[picalcs]的占位符中。

如果您所需要的位数超出了双精度数可以存储的位数,则需要创建一个数据存储系统。您可以“使用”一个数组来单独存储double的位值,每个位值都包含16位数字。但是您需要将彼此相减以获得更多的值。

例如,如果您的第一个索引存储:3.14159 26535 89793 然后使用第二个索引获取更多的pi值,然后从第一个索引中减去pi以获得下一个16个值:23846 26433 83279 5

这应该使您可以根据需要获取pi的位数。希望这会有所帮助,祝你好运。

答案 2 :(得分:0)

尝试此操作,其中值是用户输入的数字和指针 3.141592653589793115997963468544185161590576171875如果用户使用inter inter 1作为值 如果将用户inter 2作为值,则为6.28318530717958623199592693708837032318115234375

select CustomerId, PurchaseDate 
From Orders
Where PurchaseDate between '08/01/18' and '08/31/18' --- can't be changed
or PurchaseDate between '07/01/18' and '07/31/18' ----