import java.math.*; // マーチンの公式を使用 // pi = 16*{1/5-1/(3*5^3)+1/(5*5^5)-1/(7*5^7)...} // -4*{1/239-1/(3*239^3)+1/(5*239^5)-1/(7*239^7)...} class pi { static int scale = 30; static int loop = 1000; public static void main(String[] args) { BigDecimal bdZero = new BigDecimal(BigInteger.ZERO, scale); BigDecimal bdOne = bdZero.add(new BigDecimal(1)); BigDecimal bdFive = bdZero.add(new BigDecimal(5)); BigDecimal bd239 = bdZero.add(new BigDecimal(239)); BigInteger biFive = new BigInteger("5"); BigInteger bi239 = new BigInteger("239"); BigDecimal v1 = bdOne.divide(bdFive, BigDecimal.ROUND_HALF_EVEN); BigDecimal v2 = bdOne.divide(bd239, BigDecimal.ROUND_HALF_EVEN); for (int i = 1; i <= loop; i++) { int n = i * 2 + 1; BigInteger biN = new BigInteger("" + n); BigInteger i1 = biFive.pow(n); BigInteger i2 = bi239.pow(n); i1 = i1.multiply(biN); i2 = i2.multiply(biN); BigDecimal t1 = bdOne.divide(new BigDecimal(i1), BigDecimal.ROUND_HALF_EVEN); BigDecimal t2 = bdOne.divide(new BigDecimal(i2), BigDecimal.ROUND_HALF_EVEN); if ((i % 2) == 0) { v1 = v1.add(t1); v2 = v2.add(t2); } else { v1 = v1.subtract(t1); v2 = v2.subtract(t2); } } v1 = v1.multiply(new BigDecimal(16)); v2 = v2.multiply(new BigDecimal(4)); v1 = v1.subtract(v2); System.out.println("pi:" + v1.toString()); } }