2014-02-11 2 views
-3

Следующий код не дает мне никаких ошибок, но он не вычисляет Pi правильно. Пожалуйста, посмотрите, можете ли вы узнать, что я делаю неправильно.Невозможно рассчитать PI, Не дает мне никакой ошибки

Основной метод:

public static void main(String [] args){ 

    Pi obj1=new Pi(); 
    System.out.println("The answer is: " + obj1.calculatePi(20)); 
} 

calculatePi метод:

public BigDecimal calculatePi (int iterations) { 
    BigDecimal result = new BigDecimal(0); // The result (summation of Taylor series)  
    BigDecimal nextTerm= new BigDecimal(0); 
    BigDecimal j= new BigDecimal(2); 
    BigDecimal i= new BigDecimal(4); 
    BigDecimal num= new BigDecimal(16); 
    BigDecimal oddNum = new BigDecimal(1); // Odd numbers (1, 3, 5, 7 etc.)  
    BigDecimal pow5 = new BigDecimal(5);  // Odd powers of 5 (5^1, 5^3, 5^5 etc.)  
    BigDecimal pow239 =new BigDecimal(239); // Odd powers of 239 (239^1, 239^3, 239^5 etc.)  
    BigDecimal sign = new BigDecimal(1);  // Either 1 or -1 indicating the sign of the next term    
    for (int count = 0; count < iterations; count++) {   // Calculate and add the next term in the series. 
     // The sign of each new term alternates.   
     nextTerm = num.divide (pow5.multiply(oddNum),100,BigDecimal.ROUND_HALF_UP).subtract (i.divide (pow239.multiply(oddNum),100, BigDecimal.ROUND_HALF_UP)); 
     result= sign.multiply(nextTerm).add(result);      // Update variables for next time around loop   
     pow5 = pow5.multiply(pow5).multiply(pow5);   
     pow239 = pow239.multiply(pow239).multiply(pow239);   
     oddNum= oddNum.add(j);   
     sign = sign.subtract(sign);  } 
    return result; 
} 
+7

После очистки форматирования, возможно, также можно обеспечить ожидаемый/фактический выход? – sheltem

+0

Ожидаемый результат - это то, что я хочу вычислить PI на тысячи мест. – user3298474

ответ

0

Вы не получаете результат, потому что ваша программа продолжает работать. Подумайте о размере чисел, которые вы вычисляете там в этом методе. 11 итераций - это растяжение на моей машине, 20, вероятно, далеко вне досягаемости обычного ПК. Попробуйте запустить 5 итераций и оптимизируйте свой алгоритм, прежде чем снова повыситься.

Кроме того, lejlot является правильным, вы должны отрицать знак, а не просто выставлять его из одной итерации в другую.

Edit: Для 10 итераций я получаю следующий результат: Pi: 3.140598667726060313997433309223757530269291966682082323...

Так как мы все знаем из памяти, что Pi начинается как 3.14159265358979323846264... это еще не все, что точные пока.

+0

Спасибо, что работает сейчас ... Я полностью упустил способность моего компьютера. Спасибо всем. – user3298474

+0

Нет проблем. Надеюсь, что я не оторвался от скуки и удачи в улучшении ваших результатов. :) – sheltem

3

Одна из ошибок, которые видны здесь, является то, что sign должен чередоваться между -1 и 1, и ваш становится 0 во второй итерации

sign = sign.subtract(sign); 

начинается с 1, так

sign = 1 - 1 // == 0 

должно быть

sign = sign.negate(); 
+0

Спасибо, что ответили, как бы неудачно, все та же вещь .... программа работает без вывода. – user3298474

Смежные вопросы