I try to implement BBP formula for calculating milion elements of PI. I have problem with calculating and displaying results. When I set i for 1 000 000 in loop and MathContext() for more than 1000 than program not ending. I paste my code below, please help.
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
public class Rsi {
public static void main(String[] args) {
BigDecimal iterationResult, temp, temp2, temp3, temp4, temp5,
one, two, four, five, six, eight, sixteen, ii, result, pd, tc;
result = new BigDecimal(0);
result.setScale(1000000, RoundingMode.HALF_DOWN);
for (int i = 0; i < 1000000; i++) {
pd = new BigDecimal(0);
tc = new BigDecimal(0);
temp = new BigDecimal(0);
temp2 = new BigDecimal(0);
temp3 = new BigDecimal(0);
temp4 = new BigDecimal(0);
temp5 = new BigDecimal(0);
two = new BigDecimal(2);
four = new BigDecimal(4);
five = new BigDecimal(5);
six = new BigDecimal(6);
eight = new BigDecimal(8);
sixteen = new BigDecimal(16);
one = new BigDecimal(1);
iterationResult = new BigDecimal(0);
ii = new BigDecimal(i);
// calculate 1/16^i
temp = one.divide((sixteen.pow(i)), new MathContext(10,
RoundingMode.HALF_DOWN));
// calculate 4/(8*i+1) first word
temp2 = four.divide((eight.multiply(ii)).add(one), new MathContext(
1000, RoundingMode.HALF_DOWN));
// calculate 2/(8*i+4) second word
temp3 = two.divide((eight.multiply(ii)).add(four), new MathContext(
1000, RoundingMode.HALF_DOWN));
// calculate 1/(8*i+5) third word
temp4 = one.divide(((eight.multiply(ii)).add(five)),
new MathContext(1000, RoundingMode.HALF_DOWN));
// calculate 1/(8*i+6) fourth word
temp5 = one.divide(((eight.multiply(ii)).add(six)),
new MathContext(1000, RoundingMode.HALF_DOWN));
// calculate ( 4/(8*i+1) )-( 2/(8*i+4) ) first - second
pd = temp2.subtract(temp3);
// calculate -third-fourth word
tc = (temp4.negate()).subtract(temp5);
// calculate 1/16^k * ((first - second) + (-third - fourth))
iterationResult = temp.multiply((pd.add(tc)));
result = result.add(iterationResult);
}
System.out.println("Result is " + result);
}
}
Why i can't display 1 million of digits when i set loop for 1 million and MathContext for million too?
The problem is just your computer is too slow to compute it. The difficulty of this task grows very quickly (probably by
n^3), so if it takes around 1 second to compute1 000digits, it will take roughly a billion seconds to compute1 000 000digits. Apparently such tasks are computed using heavily optimized code and using computational clusters. I guess, the BBP formula would work much better if you use specially crafted data type which performs all the intermediate computations in hexadecimal and convert to decimal only at the end to print the result. This way1/16^istep will be trivial. SoBigDecimaljava type is not very optimal for such computations.