Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java制作BBP算法,计算n位数_Java_Algorithm_Math_Pi_Digit - Fatal编程技术网

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

用Java制作BBP算法,计算n位数,java,algorithm,math,pi,digit,Java,Algorithm,Math,Pi,Digit,我已经启动了一个java项目来计算pi的第n位数字,并决定使用BBP算法。 在我的输出中(在另一节课上),我得到了一些奇怪的数学错误,我不知道它是从哪里来的。因此,我认为我没有正确地将算法放入代码中 我从计算机上得到了算法 这是我的密码: import java.lang.Math; import java.lang.Math.*; public class Pi { public static double getDigit(int n, int infinity) { int pow =

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

我从计算机上得到了算法

这是我的密码:

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;
}
import java.lang.Math;
导入java.lang.Math.*;
公共类Pi
{
公共静态双位数(整数n,整数无穷大)
{int-pow=0;
双[]和=新的双[4];
int-tot=0;
int结果=0;
双分数=0;
对于(int x=0;x<4;x++)
{
对于(int k=0;k1),则为else
tot++;
pow=n-k;
结果=模块化功率(16,功率,tot);
和[x]+=(双)结果/(双)总和;
}
for(int i=n+1;i<无穷大;i++)
{
tot=8*i+1;
如果(x==1)
tot+=3;
如果(x>1),则为else
tot++;
分数=数学功率(16.0,(双)功率);
总和[x]+=分数/(双)总和;
}
}
返回4*和[0]-2*和[1]-和[2]-和[3];
}
公共静态整数模幂(整数基、整数指数、整数模)
{
int结果=1;
而(指数>0)
{
如果(指数%2==1)
结果=(结果*基础)%模数;
指数--;
基底=(基底*基底)%模量;
}
返回结果;
}

提前感谢。

首先,我为一篇旧文章的死灰复燃表示歉意,但对于BBP算法的有效应用,我们严重缺乏解释,因此我认为这可能对一些想研究它的人仍然有用


根据维基百科的文章,返回的结果需要去掉整数部分(保留小数部分)然后乘以16。这应该将整数部分保留为π的第n个十六进制数字的表示形式。我明天将对其进行测试,看看是否有帮助。否则,很好的实现,很容易理解,而且效率很高。

您可能不应该为此使用
double
s。它们只有53位精度。您可能需要如果你没有做太多的算术,试着改用
BigDecimal
。错误很大,所以使用BigDecimal只会改变一点。BBP是一种spiget算法,所以它应该只适用于整数和BigDecimal,后者只适用于更高精度的除法。不过,BBP提供16位数字。