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."); } } }