2011-12-01 144 views
5

我正在尝试使Android手机计算Pi的n个小数。为此,我正在使用此代码:在Android手机上计算Pi

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; 
} 

这就像任何一台计算机上的魅力,但是当我尝试在我的Android平板电脑上运行这一点,决定Pi为0.8的东西。为什么这个错过计算发生,我该如何做这项工作?

+0

发现当我与JDK 1.7.0_1(win32的甲骨文VM)执行该代码调用PI(100),我还得到0.8 ... ...作为结果。 – Robert

+0

ONE从哪里来?我是一个Java新手,但这看起来不像工作代码,因为我必须进行更改才能构建它。一旦我补充说,我也得到了0.8 ... – Brad

+0

我只是在台式机上运行它,得到了.8472 ...我在一台Ubuntu 64位机器上,如果这是相关的,那么Java 1.6。你在跑什么,你实际上得到了Pi的近似值?另外,我通过做Pi myPi = new Pi()来测试; myPi.pi(10);打印(myPi.returnNum); - 这是正确的? –

回答

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