Sub Class_Globals
Private Root As B4XView
Private xui As XUI
' Inline Java object
Private joInlineJava As JavaObject = Me
End Sub
Public Sub Initialize
' B4XPages.GetManager.LogEvents = True
End Sub
'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
Root = Root1
Root.LoadLayout("MainPage")
End Sub
Private Sub Button1_Click
' Example: compute 3^935687429879864897 with 12 digits
Dim result As String
result = joInlineJava.RunMethod("HugePowerSci", Array("3", "935687429879864897", 12))
Log(result) ' > 2.19222399769E+446436360569697305
xui.MsgboxAsync($"3^935687429879864897 = ${result}"$, "HugePower Result")
End Sub
#If JAVA
import ch.obermuhlner.math.big.BigDecimalMath;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
public String HugePowerSci(String baseStr, String expStr, int digits) {
try {
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
import ch.obermuhlner.math.big.BigDecimalMath;
BigDecimal base = new BigDecimal(baseStr);
BigInteger exp = new BigInteger(expStr);
MathContext mc = new MathContext(digits + 50); // high precision
// log10(base)
BigDecimal log10Base = BigDecimalMath.log10(base, mc);
// exponent * log10(base)
BigDecimal exponentTimesLog = new BigDecimal(exp).multiply(log10Base, mc);
// integer and fractional parts
BigInteger intPart = exponentTimesLog.toBigInteger();
BigDecimal fracPart = exponentTimesLog.subtract(new BigDecimal(intPart), mc);
// significand = 10^fractional_part
BigDecimal significand = BigDecimalMath.pow(BigDecimal.TEN, fracPart, mc);
// round to requested digits
significand = significand.round(new MathContext(digits));
return significand.toPlainString() + "E+" + intPart.toString();
} catch (Exception e) {
return "Error: " + e.getMessage();
}
}
#End If