import java.math.BigDecimal;

/**
 * This is a serial version of computing pi that uses a threshold value
 * Original Source Code: http://research.cs.queensu.ca/home/cmpe212/Fall2011/Lab6/Lab6.java
 */
public class PiSerial2 {
    public static void main(String[] args) {

        final int scale;
        // Default scale is 5000, if user does not specify one
        if (args.length > 0) {
            scale = Integer.parseInt(args[0]);
        } else {
            scale = 5000;
        }

        System.out.println("required precision = " + scale);

        for (int iter = 0; iter < 8; iter++) {
            final long startTime = System.nanoTime();

            BigDecimal sum = BigDecimal.ZERO;

            // Uses the BBP formula to estimate pi using BigDecimals
            // http://mathworld.wolfram.com/BBPFormula.html
            int k = 0;
            BigDecimal tolerance = BigDecimal.ONE.movePointLeft(scale);
            while (true) {
                final BigDecimal term = PiUtil.calculateBbpTerm(scale, k);
                sum = sum.add(term);
                k++;

                // dynamically determine when to stop
                if (term.compareTo(tolerance) <= 0) {
                    break;
                }

            }

            final long endTime = System.nanoTime();
            final long execTime = (long) ((endTime - startTime) / 1e6);

            System.out.println("PI = " + sum.toPlainString());
            System.out.println("Iteration-" + iter + " Exec Time = " + execTime + " ms.");
        }
    }
}