Roztwór do argumentów pod 1.7976931348623157E308 (Double.MAX_VALUE), ale wyniki wspierające miliony cyfr:
Od numerów podwójnych obsługuje do MAX_VALUE (na przykład 100! w podwójnym wygląda tak: 9.332621544394415E157), nie ma problemu, aby użyć BigDecimal.doubleValue(). Ale nie powinieneś po prostu robić Math.pow (double, double), ponieważ jeśli wynik jest większy niż MAX_VALUE, otrzymasz nieskończoność. SO: użyj wzoru X^(A + B) = X^A * X^B, aby oddzielić obliczenia na DWIE moce, duże, używając BigDecimal.pow i małe (pozostałość drugiego argumentu), używając Math. pow, a następnie pomnóż. X zostanie skopiowany do DOUBLE - upewnij się, że nie jest większy niż MAX_VALUE, A będzie INT (maksymalnie 2147483647, ale BigDecimal.pow nie obsługuje liczb całkowitych więcej niż miliard), a B będzie podwójne, zawsze mniejsze niż 1. w ten sposób można wykonać następujące czynności (ignorować moje prywatne stałych itp):
int signOf2 = n2.signum();
try {
// Perform X^(A+B)=X^A*X^B (B = remainder)
double dn1 = n1.doubleValue();
// Compare the same row of digits according to context
if (!CalculatorUtils.isEqual(n1, dn1))
throw new Exception(); // Cannot convert n1 to double
n2 = n2.multiply(new BigDecimal(signOf2)); // n2 is now positive
BigDecimal remainderOf2 = n2.remainder(BigDecimal.ONE);
BigDecimal n2IntPart = n2.subtract(remainderOf2);
// Calculate big part of the power using context -
// bigger range and performance but lower accuracy
BigDecimal intPow = n1.pow(n2IntPart.intValueExact(),
CalculatorConstants.DEFAULT_CONTEXT);
BigDecimal doublePow =
new BigDecimal(Math.pow(dn1, remainderOf2.doubleValue()));
result = intPow.multiply(doublePow);
} catch (Exception e) {
if (e instanceof CalculatorException)
throw (CalculatorException) e;
throw new CalculatorException(
CalculatorConstants.Errors.UNSUPPORTED_NUMBER_ +
"power!");
}
// Fix negative power
if (signOf2 == -1)
result = BigDecimal.ONE.divide(result, CalculatorConstants.BIG_SCALE,
RoundingMode.HALF_UP);
Rezultaty przykładów:
50!^10! = 12.50911317862076252364259*10^233996181
50!^0.06 = 7395.788659356498101260513
mógłbyś podać przykład tego, co chcesz osiągnąć, 8^2 = 64 dźwięki słabe i 2^100^100 musi zostać zmniejszone. – stacker
Muszę powiedzieć, że wypróbowałem sztuczkę z formułą, która działa dobrze nawet z liczbami z milionami cyfr! (Wygląda na to, że nie wiem wszystkiego o podwójnym i wewnętrznym) ... Przykłady: 50!^10! = 12.50911317862076252364259 * 10^233996181 50!^0.06 = 7395.788659356498101260513 Kod jest trochę długi, aby zamieścić tutaj, ale masz pomysł X^(A + B) = X^A * X^B ... Teraz Próbuję zrozumieć, jak i dlaczego (a jeśli) to naprawdę działa z liczbami, które są ogromne. –
Już podałem rozwiązanie tam http://stackoverflow.com/questions/11848887/bigdecimal-to-power-of-bigdecimal-on-java-android/22556217#22556217 –