Java 如何用base 16为BBP算法求PI
我用下面的代码来计算π,但我得到了错误的答案,因为有些公式使用了基数16。维基百科上说这个公式和十六进制有关,但我不知道公式过程的哪一部分。你使用16进制的公式的哪一部分,它是公式的输入还是仅仅是输出?例如,在将k输入公式之前,我是否将k转换为基数16,或者我是否将正常的基数10数字输入公式,并将公式的输出从基数16转换为基数10。错误答案给出了该代码的几个小数位错误: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
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为基进行计算。如果您愿意的话为了得到数字,请阅读谢谢你的帮助。我真的很感谢你的回答。这个答案帮助了我。