private static BigDecimal lnNewton(
            BigDecimal x,
            Generic_BigDecimal a_Generic_BigDecimal,
            int scale,
            RoundingMode a_RoundingMode) {
        BigDecimal result = new BigDecimal(x.toString());
        int sp1 = scale + 1;
        BigDecimal term;
        // Convergence tolerance = 5*(10^-(scale+1))
        BigDecimal tolerance = BigDecimal.valueOf(5).movePointLeft(sp1);
        // Loop until the approximation converges
        // (two successive approximations are within the tolerance).
        do {
            // e^toCompare
            BigDecimal exp = exp(
                    result,
                    a_Generic_BigDecimal,
                    sp1,
                    a_RoundingMode);
            // (e^toCompare - x)/e^toCompare
            term = exp.subtract(x).divide(exp, sp1, a_RoundingMode);
            // toCompare - (e^toCompare - x)/e^toCompare
            result = result.subtract(term);
            //Thread.yield();
        } while (term.compareTo(tolerance) > 0);
        return result.setScale(scale, a_RoundingMode);
    }