Как рассчитать только n-ю цифру числа Пи? - PullRequest
0 голосов
/ 31 августа 2018

Я использую формулу BBP для n-й цифры числа Pi. Обычная формула BBP вычисляет Pi для определенного количества цифр Pi. Я пытаюсь получить значение одной цифры Пи. Есть раздел веб-сайта формулы Википедии BBP о том, как получить n-ю цифру числа Пи. Этот раздел является ссылкой . Поэтому я создал программу на Java для вычисления n-й цифры числа Pi, используя мою интерпретацию формулы BBP для вычисления n-й цифры, как показано на следующем рисунке:

Формула

Вот код для моей Java-программы. Пожалуйста, дайте мне знать, если в моей формуле или коде Java есть ошибка для вычисления 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 голосов
/ 31 августа 2018

Вам нужно будет использовать комбинацию программы @tim Biegeleisen и этого. Сначала вам нужно будет рассчитать столько цифр числа пи, сколько вам потребуется, поэтому используйте информацию, найденную в этой теме: Расчет программы на Java Java

Формула не "простая", поэтому я не буду копировать какой-либо код из потока, вы можете убедиться в этом сами.

Как только вы использовали их способ расчета, используйте

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

с вычислениями числа pi, включенными в заполнитель [picalcs] в коде.

Если вам нужно больше, чем количество цифр, которое может хранить двойное число, вам необходимо создать систему хранения данных. Вы «можете» использовать массив для отдельного хранения двойных значений, каждое из которых содержит 16 цифр. Но вам нужно будет вычесть цифры друг из друга, чтобы получить больше значений.

Например, если ваш первый индекс хранит: 3.14159 26535 89793 затем, чтобы получить ваш второй индекс, возьмите больше значений pi и вычтите его из первого, чтобы получить следующие 16 значений: 23846 26433 83279 5

Это должно позволить вам получить значение числа Пи для столько раз, сколько вам нужно. Надеюсь, это поможет, удачи.

0 голосов
/ 31 августа 2018

попробуйте это, где значение - это число, которое вводит пользователь и указатель 3.141592653589793115997963468544185161590576171875, если пользователь inter 1 в качестве значения 6.28318530717958623199592693708837032318115234375, если пользователь inter 2 имеет значение

public static BigDecimal nPi(int value, int pointer) {
    return new BigDecimal(Math.PI  * value).movePointLeft(pointer);
}
0 голосов
/ 31 августа 2018

Это не прямой ответ на ваш вопрос или решение проблем в вашем коде, но практический способ получить цифру nth в Pi в Java - это просто подстрока 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 цифр. Но, если вы не занимаетесь точной математикой, эта опция может быть вам полезна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...