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