gpt4 book ai didi

java - BBP算法如何以16为底得到PI

转载 作者:行者123 更新时间:2023-12-02 10:52:46 25 4
gpt4 key购买 nike

我正在使用以下代码来计算 Pi,但我得到了错误的答案,因为该公式如何使用基数 16。维基百科说 here该公式与十六进制有关,但我不知道公式过程的哪一部分。公式的哪一部分使用了 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);
}
}

最佳答案

您的代码正确实现了 Bailey–Borwein–Plouffe 公式。它计算出的 π 估计值随着您使用的迭代次数的增加而增加:

  • 输入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

您使用的精度越高(此处由 BigDecimaldivide 方法中的参数 30 设置)以及运行的迭代次数越多, π 的近似值越好。

关于java - BBP算法如何以16为底得到PI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52027270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com