Создание алгоритма BBP для Java, вычисление n-й цифры

Я начал проект Java для вычисления n-й цифры числа пи и решил использовать алгоритм 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;
}

Заранее спасибо.


person user2268648    schedule 11.04.2013    source источник
comment
Вероятно, вам не следует использовать для этого doubles. У них всего 53 бита точности. Вместо этого вы можете попробовать использовать BigDecimal, если вы не слишком много занимаетесь арифметикой.   -  person tmyklebu    schedule 11.04.2013
comment
Ошибки большие, поэтому использование BigDecimal лишь немного изменит ситуацию.   -  person user2268648    schedule 11.04.2013
comment
BBP, насколько мне известно, представляет собой алгоритм с вставкой, поэтому он должен быть выполним только с целыми числами и BigDecimal, последний - только для деления с более высокой точностью. Однако BBP выдает 16-битные цифры.   -  person Rudy Velthuis    schedule 11.01.2016


Ответы (1)


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

Согласно статье в Википедии, возвращаемый вами результат должен быть лишен целой части (оставив дробную часть), а затем умножен на 16. Это должно оставить целую часть как представление n-й шестнадцатеричной цифры числа пи. Завтра проверю, может поможет. В остальном отличная реализация, простая для понимания и эффективно выполненная.

person James Gallicchio    schedule 09.08.2016