2011-12-01 5 views
5

J'essaie de faire un téléphone Android calculer n décimales de Pi. Pour cela, je suis en utilisant ce code:Calculer Pi sur un téléphone 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; 
} 

Cela fonctionne comme un charme sur un ordinateur, mais lorsque je tente de l'exécuter sur ma tablette Android, il décide que Pi est de 0,8 quelque chose. Pourquoi ce calcul manque-t-il et comment puis-je faire ce travail?

+0

Lorsque j'exécute ce code avec JDK 1.7.0_1 (win32 Oracle VM) appelant pi (100) Je reçois aussi 0,8 ... la suite . – Robert

+0

D'où vient l'ONE? Je suis un débutant Java mais cela ne ressemble pas à du code de travail car j'ai dû faire des changements pour le construire. Une fois que j'ai ajouté cela, j'ai également obtenu 0,8 ... – Brad

+0

Je l'ai juste couru sur une machine de bureau et ai obtenu .8472 ... Je suis sur une machine 64 bits d'Ubuntu, si c'est pertinent, et Java 1.6. Qu'est-ce que tu cours avec qui tu as eu une approximation de Pi? Aussi, j'ai testé en faisant Pi myPi = new Pi(); myPi.pi (10); print (myPi.returnNum); - C'est correct? –

Répondre

1

Il vous manque un peu de calcul. La ligne:

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

n'est assignée à rien. Affectez-le à quelque chose et imprimez cette valeur et vous constaterez que votre calcul fonctionne.

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

Cela me donne la bonne réponse.

Pour ceux qui sont intéressés, l'algorithme se trouve sur wikipedia

Questions connexes