# Android Questionlogarithms using BigDecimals [Solved}

#### Roger Daley

##### Well-Known Member
Longtime User
Hi All

I think this is a question that stetches the bounds of the forum but does anyone know how to calculate Logs using BigDecimals? Any base.

I have found many references but I am out of mathematical depth. The only code I found was Java, further out of my depth.

Regards Roger

B4X:
``````/**
* Compute the natural logarithm of x to a given scale, x > 0.
*/
public static BigDecimal ln(BigDecimal x, int scale)
{
// Check that x > 0.
if (x.signum() <= 0) {
throw new IllegalArgumentException("x <= 0");
}

// The number of digits to the left of the decimal point.
int magnitude = x.toString().length() - x.scale() - 1;

if (magnitude < 3) {
return lnNewton(x, scale);
}

// Compute magnitude*ln(x^(1/magnitude)).
else {

// x^(1/magnitude)
BigDecimal root = intRoot(x, magnitude, scale);

// ln(x^(1/magnitude))
BigDecimal lnRoot = lnNewton(root, scale);

// magnitude*ln(x^(1/magnitude))
return BigDecimal.valueOf(magnitude).multiply(lnRoot)
.setScale(scale, BigDecimal.ROUND_HALF_EVEN);
}
}

/**
* Compute the natural logarithm of x to a given scale, x > 0.
* Use Newton's algorithm.
*/
private static BigDecimal lnNewton(BigDecimal x, int scale)
{
int        sp1 = scale + 1;
BigDecimal n   = x;
BigDecimal term;

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

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

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

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

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

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

return x.setScale(scale, BigDecimal.ROUND_HALF_EVEN);
}``````

#### Roger Daley

##### Well-Known Member
Longtime User
Hi All

Answering my own question. I have resorted to using Taylor series to produce a Code Module for Logs and AntiLogs [Base e and Base 10]. Not the perfect result but better than returning to Double precision. The Code module is attached and also posted in Code Snippets.

Regards Roger

#### Attachments

• LogBD.bas
4.9 KB · Views: 324

Replies
1
Views
1K
Android Code Snippet logarithms using BigDecimals
Replies
0
Views
2K
Replies
6
Views
2K
Android Question BigDecimal problem
Replies
3
Views
2K
B4A Library BigNumbers library
Replies
20
Views
15K