在安卓手机上计算圆周率

5
我正在尝试让安卓手机计算圆周率的n位小数。我使用了以下代码:
public class Pi {

private static final BigDecimal TWO = new BigDecimal(2);
private static final BigDecimal FOUR = new BigDecimal(4);
private String nummer; 

public void pi(final int SCALE) {
    BigDecimal a = ONE;
    BigDecimal b = ONE.divide(sqrt(TWO, SCALE), SCALE, ROUND_HALF_UP);
    BigDecimal t = new BigDecimal(0.25);
    BigDecimal x = ONE;
    BigDecimal y;

    while (!a.equals(b)) {
        y = a;
        a = a.add(b).divide(TWO, SCALE, ROUND_HALF_UP);
        b = sqrt(b.multiply(y), SCALE);
        t = t.subtract(x.multiply(y.subtract(a).multiply(y.subtract(a))));
        x = x.multiply(TWO);
    }

    a.add(b).multiply(a.add(b)).divide(t.multiply(FOUR), SCALE, ROUND_HALF_UP);
    number(a);
}

public void number(BigDecimal a) {
    //nummer = a.toString().length();
    nummer = a.toString();
}

public String returnNum() {
    return nummer;
}

public static BigDecimal sqrt(BigDecimal A, final int SCALE) {
    BigDecimal x0 = new BigDecimal("0");
    BigDecimal x1 = new BigDecimal(Math.sqrt(A.doubleValue()));

    while (!x0.equals(x1)) {
        x0 = x1;
        x1 = A.divide(x0, SCALE, ROUND_HALF_UP);
        x1 = x1.add(x0);
        x1 = x1.divide(TWO, SCALE, ROUND_HALF_UP);
    }

    return x1;
}

这段代码在电脑上运行得很好,但是当我尝试在安卓平板上运行时,它会错误地将π值计算成0.8多。为什么会出现这种错误,并且如何让它正常工作呢?


当我使用JDK 1.7.0_1 (win32 Oracle VM)执行此代码并调用pi(100)时,我也得到了0.8...作为结果。 - Robert
ONE是从哪里来的?我是一个Java新手,但这似乎不像是可以工作的代码,因为我必须进行更改才能构建它。一旦我添加了那个,我也得到了0.8... - Brad
我刚在台式机上运行它,得到了0.8472...。如果相关的话,我使用的是Ubuntu 64位机器和Java 1.6。你用什么运行的,以至于你实际得到了Pi的近似值?另外,我通过执行Pi myPi = new Pi(); myPi.pi(10); print(myPi.returnNum); 进行了测试 - 这正确吗? - Alexander Lucas
更重要的是,您能否提供算法的链接,这样我们就有了比较代码的东西? - Alexander Lucas
1
@Brad ONE 是从 BigDecimal 静态导入的。您需要进行静态导入:import static java.math.BigDecimal.*; - Dave Richardson
ROUND_HALF_UP常量应包含什么值? - Lukap
1个回答

1

你的计算缺少一位。这行代码:

a.add(b).multiply(a.add(b)).divide(t.multiply(FOUR), SCALE, ROUND_HALF_UP);

还没有被赋值给任何变量。将其赋值给某个变量并打印出该变量的值,你会发现你的计算是有效的。

BigDecimal pi = a.add(b).multiply(a.add(b)).divide(t.multiply(FOUR), SCALE, ROUND_HALF_UP);
System.out.println(pi)

这给了我正确的答案。

对于那些感兴趣的人,可以在wikipedia上找到该算法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接