package elte.java2_utikalauz5.math; import java.math.BigDecimal; import java.math.MathContext; import java.math.BigDecimal.*; /** pi értékének Gauss-Legendre algoritmussal való kiszámolása lebegőpontos műveletekkel. @link.forrásfájl {@docRoot}/../data/math/src PiJava5.java @link.letöltés {@docRoot}/../data/math PiJava5.jar @since Java 2 Útikalauz programozóknak 5.0 */ class PiJava5 { private static final BigDecimal TWO = new BigDecimal(2); private static final BigDecimal FOUR = new BigDecimal(4); private static MathContext mc; public static void main(String[] args) { mc = new MathContext(Integer.parseInt(args[0])); System.out.println(pi(Integer.parseInt(args[0]))); } // Gauss-Legendre algoritmus public static BigDecimal pi(final int SCALE) { BigDecimal a = BigDecimal.ONE; BigDecimal b = BigDecimal.ONE.divide(sqrt(TWO, SCALE), mc); BigDecimal t = new BigDecimal(0.25); BigDecimal x = BigDecimal.ONE; BigDecimal y; while (!a.equals(b)) { y = a; a = a.add(b).divide(TWO, mc); b = sqrt(b.multiply(y), SCALE); t = t.subtract(x.multiply(y.subtract(a).multiply(y.subtract(a)))); x = x.multiply(TWO); } return a.add(b).multiply(a.add(b)).divide(t.multiply(FOUR), mc); } // Newton módszer public static BigDecimal sqrt(BigDecimal A, final int SCALE) { BigDecimal x0 = new BigDecimal("0"); BigDecimal x1 = new BigDecimal(Math.sqrt(A.doubleValue())); while (!x0.equals(x1)) { x0 = x1; x1 = A.divide(x0, mc); x1 = x1.add(x0); x1 = x1.divide(TWO, mc); } return x1; } }