найти значение пи до 50 цифр - PullRequest
2 голосов
/ 06 апреля 2011

Я хочу рассчитать значение ПИ до 50 цифр.

Как сделать это в Java для 50 десятичных знаков?

Ответы [ 5 ]

3 голосов
/ 06 апреля 2011

Вы не можете сделать это с типами данных по умолчанию, так как вам нужно 50 цифр: 50 / log (2) * log (10) = 166 бит. Здесь BigDecimal - это один тип, который вы можете использовать вместо этого. Но вы должны иметь в виду, что 22/7 - это всего лишь приближение числа пи, и чтобы получить правильное значение для 50 цифр, вам нужна гораздо лучшая формула (например, метод Монте-Карло, ряд Тейлора ...).

2 голосов
/ 08 апреля 2011
public class PiReCalc {
  public static final int N = 1000; // # of terms
   public static void main(String[] args) {
  BigDecimal sum = new BigDecimal(0);      // final sum
  BigDecimal term = new BigDecimal(0);           // term without sign
  BigDecimal sign = new BigDecimal(1.0);     // sign on each term

  BigDecimal one = new BigDecimal(1.0);
  BigDecimal two = new BigDecimal(2.0);

  for (int k = 0; k < N; k++) {
     BigDecimal count = new BigDecimal(k); 
     //term = 1.0/(2.0*k + 1.0);
     BigDecimal temp1 = two.multiply(count);
     BigDecimal temp2 = temp1.add(one);
     term = one.divide(temp2,50,BigDecimal.ROUND_FLOOR);

     //sum = sum + sign*term;
     BigDecimal temp3 = sign.multiply(term);
     sum = sum.add(temp3);

     sign = sign.negate();
  }
  BigDecimal pi = new BigDecimal(0);
  BigDecimal four = new BigDecimal(4);
  pi = sum.multiply(four);

  System.out.println("Calculated pi (approx., " + N + " terms and 50 Decimal Places): " + pi);
  System.out.println("Actual pi: " + Math.PI);
   }
}

Выход составляет

Расчетное число Пи (прибл., 1000 членов и 50 знаков после запятой): 3.14059265383979292596359650286939597045138933077984
Фактическое число пи: 3.141592653589793

2 голосов
/ 06 апреля 2011

Вы используете двойную переменную и вместо этого должны использовать что-то, что имеет большую точность.Посмотрите на BigDecimal класс.

0 голосов
/ 08 апреля 2015

Это быстрая и грязная реализация формулы Белларда bigPi (200,2000) подходит для более 500 знаков после запятой за 75 мс.

public static BigDecimal bigPi(int max,int digits) {
    BigDecimal num2power6 = new BigDecimal(64);
    BigDecimal sum = new BigDecimal(0);
    for(int i = 0; i < max; i++ ) {
        BigDecimal tmp;
        BigDecimal term ; 
        BigDecimal divisor;
        term = new BigDecimal(-32); 
        divisor = new BigDecimal(4*i+1); 
        tmp =  term.divide(divisor, digits, BigDecimal.ROUND_FLOOR);
        term = new BigDecimal(-1); 
        divisor = new BigDecimal(4*i+3); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(256); 
        divisor = new BigDecimal(10*i+1); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(-64); 
        divisor = new BigDecimal(10*i+3); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(-4); 
        divisor = new BigDecimal(10*i+5); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(-4); 
        divisor = new BigDecimal(10*i+7); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        term = new BigDecimal(1); 
        divisor = new BigDecimal(10*i+9); 
        tmp = tmp.add(term.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
        int s = ((1-((i&1)<<1)));
        divisor = new BigDecimal(2); 
        divisor = divisor.pow(10*i).multiply(new BigDecimal(s));
        sum = sum.add(tmp.divide(divisor, digits, BigDecimal.ROUND_FLOOR));
    }
    sum = sum.divide(num2power6,digits, BigDecimal.ROUND_FLOOR);
    return sum;

}
0 голосов
/ 06 апреля 2011

Вот прорывная бумага Бэйли, Борвейна и Плуффа: http://oldweb.cecm.sfu.ca/projects/pihex/p123.pdf

Тем временем были найдены еще более быстрые формулы (следуя тем же принципам): http://en.wikipedia.org/wiki/Bellard%27s_formula

...