Beregning af den nionde rod i Java

1. Oversigt

Forsøger at finde den niende rod i Java ved hjælp af pow () er unøjagtig i nogle tilfælde. Årsagen til det er, at dobbelt tal kan miste præcision undervejs. Derfor kan det være nødvendigt at polere resultatet for at håndtere disse sager.

2. Problemet

Antag, at vi vil beregne den niende rod som:

base = 125, eksponent = 3

Med andre ord, hvilket tal til styrken 3 er 125?

Det er forudsat, at den n-th rod af et tal x er lig med antallet x i kraft af 1 / n. Så vi oversætter vores ligning til:

Niende rod = Math.pow (125, 1/3)

Resultatet er 4.999999999999999. Og 4.999999999999999 i kraft af 3 er ikke 125. Så hvordan løser vi det?

3. Beregning af det niende rod korrekt

Løsningen på ovenstående problem er for det meste en matematisk løsning, og den er så enkel som den bliver. Det er velkendt den n-th rod af et tal x er lig med antallet x i kraft af 1 / n.

Der er et par måder at udnytte ligningen ovenfor på. For det første kan vi bruge en BigDecimal og implementere vores version af Newton-Raphson-metoden. For det andet kan vi afrunde resultatet til det nærmeste tal, og til sidst kan vi definere en fejlmargen, hvor resultaterne vil være acceptable. Vi fokuserer på de sidste to tilgange.

3.1. Rund

Vi bruger nu afrunding til at løse vores problem. Lad os genbruge vores tidligere eksempel og se, hvordan vi kan opnå det rigtige resultat:

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

3.2. Fejlmargin

Denne tilgang ligner meget på ovenstående. Vi skal bare definere en acceptabel fejlmargen, antag 0,00001:

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

Testen viser, at vores metoder beregner den nte rod korrekt.

4. Konklusion

Som udviklere skal vi forstå datatyperne og deres adfærd. De ovennævnte matematiske metoder fungerer rigtig godt med temmelig god nøjagtighed. Du kan vælge den, der passer bedre til din brugssag. Koden til løsningen ovenfor kan findes på GitHub.