Java program to generate PI digits using Nilakantha series using double and BigDecimal.

After 500.000 iterations as expected it generates 16 correct decimal digits.

```3.14159265358978689874902556766755878925323486328125
3.141592653589793240462643383269502884197291399375103050974944693349816400880678999026756787303333903```

Main.java

```import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;

// ? 2019 TheFlyingKeyboard and released under MIT License
// theflyingkeyboard.net

public class Main {

private static final int scale = 100;

public static void main(String[] args) {
long iterations = 500000;

System.out.println(new BigDecimal(nilakantha(iterations)));
System.out.println(nilakanthaBigDecimal(iterations));
}

private static double nilakantha(long iterations) {
iterations -= 1;
double pi = 3;
long divisorBegin = 2;
double divisor;

for (long i = 0; i < iterations; ++i) {
divisor = 1.0d;
for(long j = 0; j < 3; ++j) {
divisor *= divisorBegin + j;
}

pi += i % 2 == 0 ? 4.0d / divisor : -4.0d / divisor;
divisorBegin += 2;
}

return pi;
}

private static BigDecimal nilakanthaBigDecimal(long iterations) {
iterations -= 1;
BigDecimal pi = new BigDecimal(3);
BigDecimal divisorBegin = new BigDecimal(2);
BigDecimal divisor;

BigDecimal one = new BigDecimal(1);
BigDecimal two = new BigDecimal(2);
BigDecimal four = new BigDecimal(4);
BigDecimal minusFour = new BigDecimal(-4);
MathContext mc = new MathContext(scale);

for (long i = 0; i < iterations; ++i) {
divisor = one;
for(long j = 0; j < 3; ++j) {
divisor = divisor.multiply(new BigDecimal(j).add(divisorBegin, mc), mc);
}

pi = pi.add(i % 2 == 0 ? four.divide(divisor, mc) : minusFour.divide(divisor, mc), mc);
}

return pi;
}
}
```

Java PI Generation – Nilakantha
Tagged on: