ph-math/src/main/java/com/helger/numbercruncher/mathutils/BigFunctions.java
private static BigDecimal _lnNewton (@Nonnull final BigDecimal px, final int scale)
  {
    BigDecimal x = px;
    final int sp1 = scale + 1;
    final BigDecimal n = x;
    BigDecimal term;

    // Convergence tolerance = 5*(10^-(scale+1))
    final BigDecimal tolerance = BigDecimal.valueOf (5).movePointLeft (sp1);

    // Loop until the approximations converge
    // (two successive approximations are within the tolerance).
    do
    {

      // e^x
      final BigDecimal eToX = exp (x, sp1);

      // (e^x - n)/e^x
      term = eToX.subtract (n).divide (eToX, sp1, RoundingMode.DOWN);

      // x - (e^x - n)/e^x
      x = x.subtract (term);

      Thread.yield ();
    } while (term.compareTo (tolerance) > 0);

    return x.setScale (scale, RoundingMode.HALF_EVEN);
  }
private static BigDecimal _lnNewton (@Nonnull final BigDecimal px, final int scale)
  {
    BigDecimal x = px;
    final int sp1 = scale + 1;
    final BigDecimal n = x;
    BigDecimal term;

    // Convergence tolerance = 5*(10^-(scale+1))
    final BigDecimal tolerance = BigDecimal.valueOf (5).movePointLeft (sp1);

    // Loop until the approximations converge
    // (two successive approximations are within the tolerance).
    do
    {

      // e^x
      final BigDecimal eToX = exp (x, sp1);

      // (e^x - n)/e^x
      term = eToX.subtract (n).divide (eToX, sp1, RoundingMode.DOWN);

      // x - (e^x - n)/e^x
      x = x.subtract (term);

      Thread.yield ();
    } while (term.compareTo (tolerance) > 0);

    return x.setScale (scale, RoundingMode.HALF_EVEN);
  }
private static BigDecimal _lnNewton ( @ Nonnull final BigDecimal px , final int scale ) { BigDecimal x = px ; final int sp1 = scale + 1 ; final BigDecimal n = x ; BigDecimal term ; // Convergence tolerance = 5*(10^-(scale+1)) final BigDecimal tolerance = BigDecimal . valueOf ( 5 ) . movePointLeft ( sp1 ) ; // Loop until the approximations converge // (two successive approximations are within the tolerance). do { // e^x final BigDecimal eToX = exp ( x , sp1 ) ; // (e^x - n)/e^x term = eToX . subtract ( n ) . divide ( eToX , sp1 , RoundingMode . DOWN ) ; // x - (e^x - n)/e^x x = x . subtract ( term ) ; Thread . yield ( ) ; } while ( term . compareTo ( tolerance ) > 0 ) ; return x . setScale ( scale , RoundingMode . HALF_EVEN ) ; }
Compute the natural logarithm of x to a given scale, x > 0. Use Newton's
algorithm.
Compute the natural logarithm of x to a given scale x > 0 . Use Newton s algorithm .