Berekening van de zoveelste wortel in Java

1. Overzicht

Proberen de n-de wortel in Java te vinden met pow () is in sommige gevallen onnauwkeurig. De reden hiervoor is dat dubbele getallen onderweg precisie kunnen verliezen. Daarom moeten we het resultaat mogelijk bijschaven om deze gevallen te behandelen.

2. Het probleem

Stel dat we de N-de wortel willen berekenen als:

grondtal = 125, exponent = 3

Met andere woorden, welk getal met de macht van 3 is 125?

Het is voorzien dat de n-de wortel van een getal x is gelijk aan het getal x in de macht van 1 / n. Dus vertalen we onze vergelijking naar:

N-de wortel = Math.pow (125, 1/3)

Het resultaat is 4.999999999999999. En 4.999999999999999 tot de macht 3 is niet 125. Dus hoe lossen we dat op?

3. De N-de wortel correct berekenen

De oplossing voor het bovenstaande probleem is meestal een wiskundige oplossing, en het is zo eenvoudig als het wordt. Dat is bekend de n-de wortel van een getal x is gelijk aan het getal x in de macht van 1 / n.

Er zijn een paar manieren om de bovenstaande vergelijking te gebruiken. Ten eerste kunnen we een BigDecimal en onze versie van de Newton-Raphson-methode implementeren. Ten tweede kunnen we het resultaat afronden naar het dichtstbijzijnde getal en ten slotte kunnen we een foutmarge definiëren waarbij de resultaten acceptabel zijn. We zullen ons concentreren op de laatste twee benaderingen.

3.1. Ronde

We zullen nu afronding gebruiken om ons probleem op te lossen. Laten we ons vorige voorbeeld hergebruiken en kijken hoe we het juiste resultaat kunnen verkrijgen:

openbare leegte whenBaseIs125AndNIs3_thenNthIs5 () {dubbele nth = Math.round (Math.pow (125, 1.0 / 3.0)); assertEquals (5, nth, 0); }

3.2. Foutmarge

Deze benadering lijkt sterk op die van hierboven. We hoeven alleen een acceptabele foutmarge te definiëren, stel dat 0.00001:

openbare leegte whenBaseIs625AndNIs4_thenNthIs5 () {dubbele nth = Math.pow (625, 1.0 / 4.0); assertEquals (5, nth, 0.00001); }

De test bewijst dat onze methoden de n-de wortel correct berekenen.

4. Conclusie

Als ontwikkelaars moeten we de gegevenstypen en hun gedrag begrijpen. De hierboven beschreven wiskundige methoden werken erg goed met een redelijk goede nauwkeurigheid. U kunt degene kiezen die het beste bij uw gebruikssituatie past. De code voor de bovenstaande oplossing is te vinden op GitHub.