package lab.util; import java.math.BigDecimal; import java.math.MathContext; import static java.lang.Double.NaN; public class BigDecimalSqrt { private static final BigDecimal TWO = BigDecimal.valueOf(2L); public static BigDecimal sqrt(BigDecimal x, MathContext mc) { BigDecimal g = x.divide(TWO, mc); boolean done = false; final int maxIterations = mc.getPrecision() + 1; for (int i = 0; !done && i < maxIterations; i++) { // r = (x/g + g) / 2 BigDecimal r = x.divide(g, mc); r = r.add(g); r = r.divide(TWO, mc); done = r.equals(g); g = r; } return g; } }