Вычисление n-го корня в Java

Вычисление n-го корня в Java

1. обзор

Попытка найти корень n-й степени в Java с использованиемpow() в некоторых случаях является неточной. Причина в том, что двойные числа могут потерять точность на пути. Следовательно, нам может потребоваться отполировать результат для обработки этих случаев.

2. Эта проблема

Предположим, мы хотим вычислить N-й корень как:

base = 125, exponent = 3

Другими словами, какое число в степени 3 равно 125?

При условии, чтоthe n-th root of a number x is equal with the number x in the power of 1/n. Таким образом, мы переводим наше уравнение в:

N-th root = Math.pow(125, 1/3)

Результат 4.999999999999999. И 4.999999999999999 до степени 3 не 125. Так как же это исправить?

3. Правильный расчет N-го корня

Решение вышеупомянутой проблемы - это в основном математический обходной путь, и он настолько прост, насколько это возможно. Хорошо известно, чтоthe n-th root of a number x is equal with the number x in the power of 1/n.

Есть несколько способов использовать уравнение выше. Во-первых, мы можем использоватьBigDecimal и реализовать нашу версию методаNewton-Raphson. Во-вторых, мы можем округлить результат до ближайшего числа и, наконец, мы можем определить погрешность, где результаты будут приемлемыми. Остановимся на двух последних подходах.

3.1. Круглый

Теперь воспользуемся округлением, чтобы решить нашу проблему. Давайте повторно воспользуемся нашим предыдущим примером и посмотрим, как мы можем получить правильный результат:

public void whenBaseIs125AndNIs3_thenNthIs5() {
    double nth = Math.round(Math.pow(125, 1.0 / 3.0));
    assertEquals(5, nth, 0);
}

3.2. Граница ошибки

Этот подход очень похож на описанный выше. Нам просто нужно определить допустимый предел погрешности, предположим, 0,00001:

public void whenBaseIs625AndNIs4_thenNthIs5() {
    double nth = Math.pow(625, 1.0 / 4.0);
    assertEquals(5, nth, 0.00001);
}

Тест доказывает, что наши методы правильно вычисляют n-й корень.

4. Заключение

Как разработчики, мы должны понимать типы данных и их поведение. Методы математики, описанные выше, работают очень хорошо с довольно хорошей точностью. Вы можете выбрать тот, который лучше подходит вашему варианту использования. Код для решения выше можно найтиover on GitHub.