Calcular Pi en un teléfono Android
Estoy tratando de hacer un teléfono Android calcular n decimales de Pi. Para esto estoy usando este código:
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 computadora, pero cuando intento ejecutar esto en mi tableta Android decide que Pi es 0.8 algo. ¿Por qué se produce este cálculo de falta y cómo puedo hacer que esto funcione?
- ¿Por qué el VoiceListener basado en Glass / GDK sólo captura VoiceCommand una vez en XE16?
- Números abreviados en Android, locales sensibles
- Enviar una estructura de C ++ sobre UDP en Java
- Manera sana de ir de ArrayList <Long> a través de una intención
- SQLiteOpenHelper - ¿Cómo se crea la base de datos?
- Bordes dentados en imágenes presentadas en Android
- Conectarse a través del nombre del servicio Bluetooth
- Java.lang.NullPointerException: Intenta invocar el método virtual 'android.view.View android.app.Activity.findViewById (int)' en una referencia de objeto nulo
- Android cámara2 api galaxia s7
- Android Bottom White Stripe al rellenar contenido Webview
- java / error de análisis. intentando enviar desde android sdk a Parse
- No se puede resolver el método getSupportActionBar () en fragmento
- Abrir un proyecto en Eclipse
Te falta un poco de tu cálculo. La línea :
a.add(b).multiply(a.add(b)).divide(t.multiply(FOUR), SCALE, ROUND_HALF_UP);
No está siendo asignado a nada. Asigne esto a algo e imprima ese valor y verá que su 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 los interesados, el algoritmo se puede encontrar en wikipedia
- Excepción de seguridad de Android al acceder a contactos
- Comunicación multihilo: ¿qué tan bueno es el uso de variables atómicas como AtomicInteger? ¿Por qué no hay AtomicFloat?