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.