/**
* Calculate X to the power of Y: x^y
* @param bigdecimal Base (x)
* @param bigdecimal1 Exponent (y)
* @param scale
* @return X to the power of Y: x^y
*/
static BigDecimal pow(BigDecimal bigdecimal, BigDecimal bigdecimal1, int scale) {
int j = scale + 5;
if(bigdecimal1.setScale(0, roundingMode).compareTo(bigdecimal1) == 0) {
boolean flag = bigdecimal1.signum() == -1;
BigInteger biginteger = bigdecimal1.abs().toBigInteger();
BigDecimal bigdecimal2 = ONE;
for(int k = biginteger.bitLength(); k > 0; k--) {
if(biginteger.testBit(k))
bigdecimal2 = bigdecimal2.multiply(bigdecimal).setScale(j, roundingMode);
bigdecimal2 = bigdecimal2.multiply(bigdecimal2).setScale(j, roundingMode);
if(interrupt)
break;
}
if(biginteger.testBit(0))
bigdecimal2 = bigdecimal2.multiply(bigdecimal).setScale(j, roundingMode);
if(flag)
bigdecimal2 = ONE.divide(bigdecimal2, j, roundingMode);
return bigdecimal2.setScale(scale, roundingMode);
}
if(bigdecimal1.compareTo(ZERO) == 0)
return ONE;
if(bigdecimal1.compareTo(ONE) == 0)
return bigdecimal;
if(bigdecimal1.compareTo(ONE.negate()) == 0)
return ONE.divide(bigdecimal, scale, roundingMode);
if(bigdecimal1.compareTo(TWO) == 0)
return bigdecimal.multiply(bigdecimal).setScale(scale, roundingMode);
if(bigdecimal1.compareTo(ONE) == 0)
return bigdecimal;
return exp(bigdecimal1.multiply(log(bigdecimal, j + 10)), j + 10).setScale(scale, roundingMode);
}
final static BigDecimal ONE = BigDecimal.valueOf(1);
final static BigDecimal TWO = BigDecimal.valueOf(2);
final static BigDecimal HALF = new BigDecimal("0.5");
final static BigDecimal THREE = BigDecimal.valueOf(3);
final static BigDecimal FOUR = BigDecimal.valueOf(4);
final static BigDecimal FIVE = BigDecimal.valueOf(5);
final static BigDecimal EIGHT = BigDecimal.valueOf(8);
final static BigDecimal NINE = BigDecimal.valueOf(9);
final static BigDecimal TWELFE = BigDecimal.valueOf(12);
final static BigDecimal SIXTEEN = BigDecimal.valueOf(16);
final static BigDecimal ZERO = BigDecimal.valueOf(0);
static BigDecimal PI_ = new BigDecimal("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643");
static BigDecimal E_ = new BigDecimal("2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328");
static BigDecimal log2_ = new BigDecimal("0.6931471805599453094172321214581765680755001343602552541206800094933936219696947156058633269964186875");
static BigDecimal log10_ = new BigDecimal("2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983");
/**
* Rounding mode applied in here
*/
public static int roundingMode = BigDecimal.ROUND_HALF_EVEN;
Hobbit_Im_Blutrausch hat gesagt.:@ meez
BigAl kann kein ^-n geschweige denn ^. ! Bin nicht so von dem Prog überezug :roll:
--------------------Configuration: <Default>--------------------
symbol : variable interrupt
if(interrupt) {
^
symbol : method log(java.math.BigDecimal,int)
return exp(bigdecimal1.multiply(log(bigdecimal, j + 10)), j + 10).setScale(scale, roundingMode);
^
2 errors
exp(bigdecimal1.multiply(log(bigdecimal, j + 10)), j + 10).setScale(scale, roundingMode)
0xdeadbeef hat gesagt.:Äh, sorry, ich dachte, Du meinst den Integeralgorithmus, denn für BigDecimals (scale >0) gibt die obige Funktion ja
zurück:Code:exp(bigdecimal1.multiply(log(bigdecimal, j + 10)), j + 10).setScale(scale, roundingMode)
Und das ist die ganz schlichte und altbekannte Umformung:
x^y = exp(y*ln(x))