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에서 알고리즘을 얻었다.
아마도 '이중'을 사용해서는 안됩니다. 그들은 단지 53 비트의 정밀도를 가지고 있습니다. 너는 너무 많은 산술을하지 않으면'BigDecimal'을 대신 사용해보십시오. – tmyklebu
오류가 크므로 BigDecimal을 사용하면 조금 변경됩니다. – user2268648
BBP는 AFAIK 인 스피 곳 (spigot) 알고리즘이기 때문에 정수와 BigDecimal만으로 수행 할 수 있어야하며, 후자는 고정밀 구분에서만 사용할 수 있습니다. BBP는 16 비트 숫자를 제공합니다. –