Java 如何用base 16为BBP算法求PI

Java 如何用base 16为BBP算法求PI,java,math,Java,Math,我用下面的代码来计算π,但我得到了错误的答案,因为有些公式使用了基数16。维基百科上说这个公式和十六进制有关,但我不知道公式过程的哪一部分。你使用16进制的公式的哪一部分,它是公式的输入还是仅仅是输出?例如,在将k输入公式之前,我是否将k转换为基数16,或者我是否将正常的基数10数字输入公式,并将公式的输出从基数16转换为基数10。错误答案给出了该代码的几个小数位错误: import java.io.Console; public class Main { public static voi

我用下面的代码来计算π,但我得到了错误的答案,因为有些公式使用了基数16。维基百科上说这个公式和十六进制有关,但我不知道公式过程的哪一部分。你使用16进制的公式的哪一部分,它是公式的输入还是仅仅是输出?例如,在将k输入公式之前,我是否将k转换为基数16,或者我是否将正常的基数10数字输入公式,并将公式的输出从基数16转换为基数10。错误答案给出了该代码的几个小数位错误:

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);
    }
}
导入java.io.Console;
公共班机{
公共静态void main(字符串[]args){
System.out.println(“输入Pi的小数位数?”);
字符串行=System.console().readLine();
double x=double.parseDouble(行);
双y=0.0;

对于(double i=0;i您的代码正确地实现了Bailey–Borwein–Plouffe公式。它计算π的估计值,该值随着迭代次数的增加而增加:

  • 输入
    1
    ,您会得到:
    3.141422466424664
  • 输入
    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));
}
BigDecimal pi=BigDecimal.ZERO;

对于(int i=0;i)什么输入会得到什么结果?你得到的错误可能是由浮点不准确造成的。
Math.pow(16.0,i)
最好是
1。你确定输入或输出不必是以16为基数。维基百科网站上说“Bailey–Borwein–Plouffe公式(BBP公式)”是一个spiget算法,用于使用base-16表示法计算数学常数π的第n个二进制数字。@matthewring表达式处理与基无关的值。此公式具有一个很好的特性,您可以分别计算以16为基的每个数字。这并不意味着它必须以16为基进行计算。如果您愿意的话为了得到数字,请阅读谢谢你的帮助。我真的很感谢你的回答。这个答案帮助了我。