2013-04-11 8 views
1

파이의 n 번째 숫자를 계산하기위한 Java 프로젝트를 시작했으며 BBP 알고리즘을 사용하기로 결정했습니다. 내 출력 (다른 클래스에서)에서 이상한 수학 오류가 발생했습니다. 어디에서 왔는지 모르겠습니다. 그래서, 나는 알고리즘에 코드를 올바르게 두지 않을 것이라고 생각합니다. 사전에Java 용 BBP 알고리즘 만들기 n 번째 숫자 계산

import java.lang.Math; 
import java.lang.Math.*; 
public class Pi 
{ 
public static double getDigit(int n, int infinity) 
{ int pow = 0; 
    double[] sums = new double[4]; 
    int tot = 0; 
    int result = 0; 
    double fraction = 0; 
    for(int x = 0; x < 4; x++) 
    { 
     for(int k = 0; k < n; k++) 
     { 
      tot = 8 * k + 1; 
      if(x == 1) 
       tot += 3; 
      else if(x > 1) 
       tot++; 
      pow = n-k; 
      result = modular_pow(16, pow, tot); 
      sums[x] += (double)result/(double)tot; 
     } 
     for(int i = n + 1; i < infinity; i++) 
     { 
      tot = 8 * i + 1; 
      if(x == 1) 
       tot += 3; 
      else if(x > 1) 
       tot++; 
      fraction = Math.pow(16.0, (double)pow); 
      sums[x] += fraction/(double)tot; 
     } 
    } 
    return 4 * sums[0] - 2 * sums[1] - sums[2] - sums[3]; 
} 
public static int modular_pow(int base, int exponent, int modulus) 
    { 
    int result = 1; 
    while(exponent > 0) 
    { 
     if (exponent % 2 == 1) 
      result = (result * base) % modulus; 
     exponent--; 
     base = (base * base) % modulus; 
    } 
    return result; 
} 

감사 :

나는 여기에 내 코드입니다 http://en.wikipedia.org/wiki/Bailey%E2%80%93Borwein%E2%80%93Plouffe_formula

에서 알고리즘을 얻었다.

+1

아마도 '이중'을 사용해서는 안됩니다. 그들은 단지 53 비트의 정밀도를 가지고 있습니다. 너는 너무 많은 산술을하지 않으면'BigDecimal'을 대신 사용해보십시오. – tmyklebu

+0

오류가 크므로 BigDecimal을 사용하면 조금 변경됩니다. – user2268648

+0

BBP는 AFAIK 인 스피 곳 (spigot) 알고리즘이기 때문에 정수와 BigDecimal만으로 수행 할 수 있어야하며, 후자는 고정밀 구분에서만 사용할 수 있습니다. BBP는 16 비트 숫자를 제공합니다. –

답변

0

첫째, 오래된 게시물 괴롭힘에 사과 하긴하지만 의미있는 방법으로 적용되는 BBP 알고리즘에 대한 설명이 매우 부족하므로이 기능을 조사하려는 사람들에게는 여전히 유용 할 수 있습니다.

위키 백과 문서를 기반으로 반환하는 결과는 정수 부분 (소수 부분 남음)을 제거한 다음 16을 곱해야합니다. 정수 부분을 n 번째 16 진수로 표현해야합니다 파이. 나는 내일 그것을 시험 할 것이고 그것이 도움이되는지 알 것이다. 그렇지 않으면, 훌륭한 구현, 이해하기 쉽고 효율적으로 수행됩니다.