Beregning av den niende roten i Java

1. Oversikt

Prøver å finne den niende roten i Java ved hjelp av pow () er unøyaktig i noen tilfeller. Årsaken til det er at doble tall kan miste presisjon på veien. Derfor må vi kanskje polere resultatet for å håndtere disse sakene.

2. Problemet

Anta at vi vil beregne den niende roten som:

base = 125, eksponent = 3

Med andre ord, hvilket tall til kraften 3 er 125?

Det er forutsatt at den niende roten til et tall x er lik tallet x i kraften til 1 / n. Så vi oversetter ligningen til:

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

Resultatet er 4.999999999999999. Og 4.999999999999999 i kraft av 3 er ikke 125. Så hvordan fikser vi det?

3. Beregning av den niende roten riktig

Løsningen på problemet ovenfor er for det meste en matematisk løsning, og den er så enkel som den blir. Det er velkjent den niende roten til et tall x er lik tallet x i kraften til 1 / n.

Det er noen måter å utnytte ligningen ovenfor. Først kan vi bruke en BigDecimal og implementere vår versjon av Newton-Raphson-metoden. For det andre kan vi avrunde resultatet til nærmeste tall, og til slutt kan vi definere en feilmargin der resultatene vil være akseptable. Vi vil fokusere på de to siste tilnærmingene.

3.1. Rund

Vi bruker nå avrunding for å løse problemet vårt. La oss bruke vårt forrige eksempel og se hvordan vi kan oppnå riktig resultat:

offentlig ugyldig nårBaseIs125AndNIs3_thenNthIs5 () {double nth = Math.round (Math.pow (125, 1.0 / 3.0)); assertEquals (5, nth, 0); }

3.2. Feilmargin

Denne tilnærmingen er veldig lik å være over. Vi trenger bare å definere en akseptabel feilmargin, antar 0,00001:

offentlig ugyldig nårBaseIs625AndNIs4_thenNthIs5 () {double nth = Math.pow (625, 1.0 / 4.0); assertEquals (5, nth, 0,00001); }

Testen viser at metodene våre beregner den nte roten riktig.

4. Konklusjon

Som utviklere må vi forstå datatypene og deres oppførsel. Matematiske metoder beskrevet ovenfor fungerer veldig bra med ganske god nøyaktighet. Du kan velge den som passer bedre din brukstilfelle. Koden for løsningen ovenfor finner du på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found