Calcul de la nième racine en Java

Calcul de la nième racine en Java

1. Vue d'ensemble

Essayer de trouver la n-ième racine en Java à l'aide depow() est inexact dans certains cas. La raison en est que les nombres doubles peuvent perdre de la précision en cours de route. Par conséquent, nous pouvons avoir besoin de peaufiner le résultat pour traiter ces cas.

2. Le problème

Supposons que nous voulions calculer la Nième racine comme suit:

base = 125, exponent = 3

En d'autres termes, quel nombre à la puissance de 3 est 125?

Il est prévu quethe n-th root of a number x is equal with the number x in the power of 1/n. Nous traduisons donc notre équation en:

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

Le résultat est 4.999999999999999. Et 4.999999999999999 à la puissance de 3 n'est pas 125. Alors, comment pouvons-nous résoudre ce problème?

3. Calculer la Nième racine correctement

La solution au problème ci-dessus est principalement une solution de contournement mathématique, et elle est aussi simple que possible. Il est bien connu quethe n-th root of a number x is equal with the number x in the power of 1/n.

Il y a plusieurs façons de tirer parti de l'équation ci-dessus. Tout d'abord, nous pouvons utiliser unBigDecimal et implémenter notre version de la méthodeNewton-Raphson. Deuxièmement, nous pouvons arrondir le résultat au nombre le plus proche et, enfin, définir une marge d'erreur dans laquelle les résultats seront acceptables. Nous allons nous concentrer sur les deux dernières approches.

3.1. Rond

Nous allons maintenant utiliser l'arrondi pour résoudre notre problème. Réutilisons notre exemple précédent et voyons comment nous pouvons obtenir le bon résultat:

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

3.2. Marge d'erreur

Cette approche est très similaire à être ci-dessus. Nous avons juste besoin de définir une marge d'erreur acceptable, supposons 0.00001:

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

Le test prouve que nos méthodes calculent correctement la nième racine.

4. Conclusion

En tant que développeurs, nous devons comprendre les types de données et leur comportement. Les méthodes mathématiques décrites ci-dessus fonctionnent très bien avec une assez bonne précision. Vous pouvez choisir celui qui convient le mieux à votre cas d'utilisation. Le code de la solution ci-dessus peut être trouvéover on GitHub.