2011-12-01 16 views
5

Estoy tratando de hacer que un teléfono Android calcule n decimales de Pi. Para ello estoy usando este código:Calcular Pi en un teléfono Android

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

Esto funciona como un encanto en cualquier ordenador, pero cuando trato de ejecutar esto en mi tableta Android decide que Pi es algo 0,8. ¿Por qué ocurre este cálculo de error y cómo puedo hacer que esto funcione?

+0

Cuando ejecuto este código con JDK 1.7.0_1 (win32 Oracle VM) llamando pi (100) También consigo 0,8 ... como el resultado . – Robert

+0

¿De dónde viene ONE? Soy un principiante de Java, pero esto no se parece al código de trabajo, ya que tuve que hacer cambios para que se compilara. Una vez que agregué eso, también obtuve 0.8 ... – Brad

+0

Lo acabo de ejecutar en una máquina de escritorio y obtuve .8472 ... Estoy en una máquina ubuntu de 64 bits, si es relevante, y Java 1.6. ¿Con qué estás corriendo que realmente tienes una aproximación de Pi? Además, probé haciendo Pi myPi = new Pi(); myPi.pi (10); imprimir (myPi.returnNum); - ¿Eso es correcto? –

Respuesta

1

Falta un poco de su cálculo. La línea:

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

no se está asignando a nada. Asigna esto a algo e imprime ese valor y verás que tu cálculo funciona.

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

Esto me da la respuesta correcta.

Para aquellos que estén interesados, el algoritmo se puede encontrar en wikipedia