Рубрики
Без рубрики

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

Узнайте, как вычислить n-й корень в Java с точностью.

Автор оригинала: Grigorios Dimopoulos.

1. Обзор

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

2. Проблема

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

base = 125, exponent = 3

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

Это при условии, что n-й корень числа x равен числу x в степени 1/n . Поэтому мы переводим наше уравнение в:

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

Результат-4,99999999999999999. И 4.99999999999999999 в степени 3 не 125. Так как же нам это исправить?

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

Решение вышеприведенной проблемы в основном является математическим обходным путем, и оно настолько просто, насколько это возможно. Хорошо известно, что n-й корень числа x равен числу x в степени 1/n .

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

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. Заключение

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