package skywriting.examples.pi; import java.io.DataInputStream; import java.io.OutputStreamWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.math.BigDecimal; import uk.co.mrry.mercator.task.Task; public class PiReducer implements Task { @Override public void invoke(InputStream[] fis, OutputStream[] fos, String[] args) { try { /** * args: none. */ /** * inputs: n files containing (long) numInside, (long) numOutside. */ long numInside = 0; long numOutside = 0; for (int i = 0; i < fis.length; ++i) { DataInputStream in = new DataInputStream(fis[i]); numInside += in.readLong(); numOutside += in.readLong(); in.close(); } //compute estimated value double actualResult; try { BigDecimal result = BigDecimal.valueOf(4).setScale(20) .multiply(BigDecimal.valueOf(numInside)) .divide(BigDecimal.valueOf(numInside + numOutside)); actualResult = result.doubleValue(); System.out.println("Result is: " + result.toPlainString()); } catch (Exception e) { actualResult = Math.PI; System.out.println("Java BigDecimal is being a pain..."); } /** * output: single file containing (double) result. */ OutputStreamWriter out = new OutputStreamWriter(fos[0]); out.write(actualResult + ""); out.close(); } catch (IOException ioe) { throw new RuntimeException(ioe); } } }