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)), вы можете достичь результата с максимальной точностью.
Тем не менее, двойники имеют хорошую точность, и я настоятельно рекомендую вам проверить, недостаточно ли это для вашей потребности.
Ответ 4
Существует хорошая библиотека ApFloat: http://www.apfloat.org/