Calculando a enésima enésima raiz em Java

Calculando a enésima enésima raiz em Java

1. Visão geral

Tentar encontrar a enésima raiz em Java usandopow() é impreciso em alguns casos. A razão para isso é que números duplos podem perder precisão no caminho. Portanto, podemos precisar polir o resultado para lidar com esses casos.

2. O problema

Suponha que desejamos calcular a enésima raiz como:

base = 125, exponent = 3

Em outras palavras, qual número com a potência de 3 é 125?

É fornecido quethe n-th root of a number x is equal with the number x in the power of 1/n. Então, traduzimos nossa equação para:

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

O resultado é 4.999999999999999. E 4.999999999999999 à potência de 3 não é 125. Então, como consertamos isso?

3. Cálculo da enésima raiz corretamente

A solução para o problema acima é principalmente uma solução alternativa matemática e é o mais simples possível. É bem sabido quethe n-th root of a number x is equal with the number x in the power of 1/n.

Existem algumas maneiras de alavancar a equação acima. Primeiro, podemos usar aBigDecimale implementar nossa versão do métodoNewton-Raphson. Em segundo lugar, podemos arredondar o resultado para o número mais próximo e, finalmente, podemos definir uma margem de erro em que os resultados serão aceitáveis. Vamos nos concentrar nas duas últimas abordagens.

3.1. Volta

Agora vamos usar o arredondamento para resolver nosso problema. Vamos reutilizar nosso exemplo anterior e ver como podemos obter o resultado certo:

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

3.2. Margem de erro

Essa abordagem é muito semelhante à anterior. Só precisamos definir uma margem de erro aceitável, suponha 0,00001:

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

O teste prova que nossos métodos calculam corretamente a enésima raiz.

4. Conclusão

Como desenvolvedores, devemos entender os tipos de dados e seu comportamento. Os métodos matemáticos descritos acima funcionam muito bem com uma precisão bastante boa. Você pode escolher aquele que melhor se adapta ao seu caso de uso. O código para a solução acima pode ser encontradoover on GitHub.