制作用于Java的BBP算法,计算第n位数

时间:2013-04-11 03:29:16

标签: java algorithm math pi digit

我已经启动了一个用于计算pi的第n位的java项目,并决定使用BBP算法。 在我的输出中(在另一个类中)我得到了一些奇怪的数学错误,我不知道它是从哪里来的。所以,我认为我没有正确地将算法放入代码中。

我从http://en.wikipedia.org/wiki/Bailey%E2%80%93Borwein%E2%80%93Plouffe_formula

获得算法

这是我的代码:

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;
}

提前致谢。

1 个答案:

答案 0 :(得分:0)

首先,对于破坏旧帖子表示道歉,但是BBP算法的解释严重缺乏有意义的应用,所以我认为这对于想要研究它的人来说可能仍然有用。

根据维基百科的文章,您返回的结果需要剥离其整数部分(保留小数部分),然后再乘以16.这应该将整数部分保留为第n个十六进制的表示pi的数字。我明天会测试一下,看看是否有帮助。否则,实施得很好,易于理解和有效完成。