BigDecimal для PowerDecimal на Java/Android

У меня есть простой BigDecimal, который я хочу использовать для другого BigDecimal, например 11.11 ^ -1.54. Какой будет самый простой способ сделать это в Java/Android? Мне не нравится идея превращения в парные, потому что это для медицинского применения, поэтому я был бы признателен за самое большое возможное приглашение. До сих пор я просмотрел http://commons.apache.org/math/ и математику из Google Guava, но ничего не нашел.

Изменить: Весь расчет является сложным и имеет много операций, подобных этому. Мне нужно как можно больше точности в конце.

Ответ 1

Утилитный класс для BigDecimal https://github.com/tareknaj/BigFunctions

Пример для z = x ^ y → z = exp (ln (x) * y)

final int SCALE = 10;
BigDecimal x = new BigDecimal(1);
BigDecimal y = new BigDecimal(12);

BigDecimal z = BigFunctions.exp( BigFunctions.ln(x, SCALE).multiply(y),SCALE );

Ответ 2

Сколько цифр точности вам нужно? Вы используете только 4 цифры в вашем примере. Если это медицинское и существует для реального мира, вы можете измерить большинство вещей в реальном мире до 10-13 цифр точности, а double - до 16 цифр точности.

System.out.println(Math.pow(11.11, -1.54));

печатает

0.024524510581710988

Если вы используете библиотеку из этой книги http://www.apropos-logic.com/nc/, вы можете получить

int runs = 10000;

long start = System.nanoTime();
double x1 = 0;
for (int i = 0; i < runs; i++)
    x1 = Math.pow(11.11, -1.54);
long time = System.nanoTime() - start;
System.out.println(x1 + " took " + time / runs / 1e3 + " us avg.");

long start2 = System.nanoTime();
BigDecimal x2 = null;
for (int i = 0; i < runs; i++)
    x2 = exp(ln(BigDecimal.valueOf(11.11), 20).multiply(BigDecimal.valueOf(-1.54)), 20);
long time2 = System.nanoTime() - start2;
System.out.println(x2 + " took " + time2 / runs / 1e3 + " us avg.");

печатает (нас за микросекунды)

0.024524510581710988 took 0.478 us avg.
0.02452451058171098739 took 603.769 us avg.

с точностью до 40 цифр

0.0245245105817109873886495555036930857940 took 1409 us avg.

который может быть достаточно быстрым на вашем устройстве.

Я не включил код, отчасти потому, что он очень длинный. Я впечатлен тем, насколько быстро это происходит.;)

Ответ 3

Посмотрите "Java Number Cruncher: Руководство программиста Java для численных вычислений" - Глава 12.5. Большие десятичные функции: существует некоторый исходный код с как можно более точный алгоритм вычисления экспоненты и логарифма.

Используя математическую формулу: x ^ y = exp (y * ln (x)), вы можете достичь результата с максимальной точностью.

Тем не менее, двойники имеют хорошую точность, и я настоятельно рекомендую вам проверить, недостаточно ли это для вашей потребности.