Как сделать базу 16 для алгоритма BBP, чтобы получить PI - PullRequest
0 голосов
/ 26 августа 2018

Я использую следующий код для вычисления Пи, но я получаю неправильный ответ, потому что формула как-то использует базу 16. Википедия говорит здесь , что формула имеет отношение к шестнадцатеричному, но я не знаю, какаячасть процесса формулы.Какую часть формулы вы используете основание 16, это ввод формулы или просто вывод?Например, я должен преобразовать k в основание 16 перед вводом k в формулу или ввести нормальное число base 10 в формулу и преобразовать вывод формулы в основание 10 из base 16. Неправильный ответ дает несколько десятичных знаков неправильно для этого кода:

import java.io.Console;

public class Main {

public static void main(String[] args) {
        System.out.println("Enter how many decimal places you want for Pi?");
        String line = System.console().readLine();
        double x = Double.parseDouble(line);
        double y = 0.0;

        for(double i = 0; i <= x; i++)
        {
            y = y + (1.0/Math.pow(16.0,i))*((4.0/(8.0*i + 1.0))-(2.0/(8.0*i + 4.0)) - 
            (1.0/(8.0*i + 5.0)) - (1.0/(8.0*i + 6.0)));
        }
        System.out.println(y);
    }
}

1 Ответ

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

Ваш код правильно реализует формулу Бэйли-Борвейна-Плуффа.Он вычисляет оценку π, которая увеличивается с большей точностью, чем больше итераций вы используете:

  • Введите 1, вы получите: 3.1414224664224664
  • Введите 2, вы получите:3.1415873903465816
  • Введите 3, вы получите: 3.1415924575674357
  • Введите 4, вы получите: 3.1415926454603365
  • Введите 5, вы получите: 3.141592653228088
  • Введите 6, вы получите: 3.141592653572881
  • Введите 7, вы получите: 3.141592653588973
  • Введите 8, выполучить: 3.1415926535897523
  • введите 9, вы получите: 3.1415926535897913
  • введите 10, вы получите: 3.141592653589793
  • введите 11,Вы получите: 3.141592653589793

И это все.Любой более высокий ввод бесполезен, потому что вы не можете получить более точную информацию при использовании double.

Если вы хотите получить более высокую точность, вы должны использовать тип с большей точностью, чем double, например BigDecimal:

BigDecimal pi = BigDecimal.ZERO;
for (int i = 0; i <= x; i++) {
    BigDecimal a = BigDecimal.valueOf(1).divide(BigDecimal.valueOf(16).pow(i), 30, RoundingMode.HALF_UP);
    BigDecimal b1 = BigDecimal.valueOf(4).divide(BigDecimal.valueOf(8).multiply(BigDecimal.valueOf(i)).add(BigDecimal.valueOf(1)), 30, RoundingMode.HALF_UP); 
    BigDecimal b2 = BigDecimal.valueOf(2).divide(BigDecimal.valueOf(8).multiply(BigDecimal.valueOf(i)).add(BigDecimal.valueOf(4)), 30, RoundingMode.HALF_UP); 
    BigDecimal b3 = BigDecimal.valueOf(1).divide(BigDecimal.valueOf(8).multiply(BigDecimal.valueOf(i)).add(BigDecimal.valueOf(5)), 30, RoundingMode.HALF_UP); 
    BigDecimal b4 = BigDecimal.valueOf(1).divide(BigDecimal.valueOf(8).multiply(BigDecimal.valueOf(i)).add(BigDecimal.valueOf(6)), 30, RoundingMode.HALF_UP); 
    BigDecimal b = b1.subtract(b2).subtract(b3).subtract(b4);
    pi = pi.add(a.multiply(b));
}
  • Введите 10, вы получите: 3.141592653589793129614170564040940187329961242598487417146011
  • Введите 100, вы получите: 3.141592653589793238462643383279097710627677399356070777774427

Чем выше точность, которую вы используете (здесь задается параметром 30 в методе divide для BigDecimal) и чем больше итераций вы выполняете, тем лучше будет аппроксимация π.

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