2011-12-01 43 views
5

Tôi đang cố gắng tạo điện thoại Android tính n số thập phân của Pi. Đối với điều này tôi đang sử dụng mã này:Tính Pi trên điện thoại 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; 
} 

Điều này hoạt động như một nét duyên dáng trên bất kỳ máy tính nào nhưng khi tôi cố gắng chạy trên máy tính bảng Android, nó quyết định rằng Pi là 0,8. Tại sao tính toán bỏ lỡ này xảy ra và làm cách nào tôi có thể thực hiện công việc này?

+0

Khi tôi thực thi mã này với JDK 1.7.0_1 (win32 Oracle VM) gọi pi (100) Tôi cũng nhận được 0,8 ... như kết quả . – Robert

+0

ONE đến từ đâu? Tôi là một newbie Java nhưng điều này không giống như mã làm việc kể từ khi tôi đã phải thực hiện thay đổi để có được nó để xây dựng. Khi tôi thêm vào đó, tôi cũng đã nhận được 0.8 ... – Brad

+0

Tôi chỉ chạy trên máy tính để bàn và có .8472 ... Tôi đang sử dụng máy 64 bit ubuntu, nếu có liên quan và Java 1.6. Những gì bạn đang chạy với điều đó bạn thực sự có một xấp xỉ của Pi? Ngoài ra, tôi đã thử nghiệm bằng cách thực hiện Pi myPi = new Pi(); myPi.pi (10); in (myPi.returnNum); - Đúng rồi? –

Trả lời

1

Bạn đang thiếu một chút so với tính toán của mình. Dòng:

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

không được gán cho bất kỳ thứ gì. Chỉ định điều này cho một cái gì đó và in giá trị đó ra và bạn sẽ thấy tính toán của mình hoạt động.

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

Điều này mang lại cho tôi câu trả lời đúng.

Đối với những người quan tâm, các thuật toán có thể được tìm thấy trên wikipedia

Các vấn đề liên quan