Izračunavanje n-tog korijena u Javi

1. Pregled

Pokušavajući pronaći n-ti korijen u Javi pomoću prah () je netočan u nekim slučajevima. Razlog tome je što dvostruki brojevi mogu izgubiti preciznost na putu. Stoga ćemo možda trebati polirati rezultat kako bismo riješili ove slučajeve.

2. Problem

Pretpostavimo da želimo izračunati N-ti korijen kao:

baza = 125, eksponent = 3

Drugim riječima, koji je broj sa potencijom 3 125?

Pod uvjetom da n-ti korijen broja x jednak je broju x u potenciji 1 / n. Dakle, prevedemo našu jednadžbu u:

N-ti korijen = Math.pow (125, 1/3)

Rezultat je 4.999999999999999. A 4.999999999999999 snage 3 nije 125. Pa kako to možemo popraviti?

3. Ispravno izračunavanje N-tog korijena

Rješenje gornjeg problema uglavnom je matematičko rješenje i vrlo je jednostavno. To je dobro poznato n-ti korijen broja x jednak je broju x u potenciji 1 / n.

Postoji nekoliko načina kako iskoristiti gornju jednadžbu. Prvo, možemo koristiti a BigDecimal i implementirati našu verziju Newton-Raphsonove metode. Drugo, možemo rezultat zaokružiti na najbliži broj i na kraju, možemo definirati granicu pogreške u kojoj će rezultati biti prihvatljivi. Usredotočit ćemo se na posljednja dva pristupa.

3.1. Krug

Sada ćemo upotrijebiti zaokruživanje kako bismo riješili svoj problem. Ponovno upotrijebimo naš prethodni primjer i vidjet ćemo kako možemo dobiti pravi rezultat:

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

3.2. Margina pogreške

Ovaj je pristup vrlo sličan gore navedenom. Samo trebamo definirati prihvatljivu marginu pogreške, pretpostavimo 0,00001:

javna praznina whenBaseIs625AndNIs4_thenNthIs5 () {double nth = Math.pow (625, 1.0 / 4.0); assertEquals (5, nth, 0,00001); }

Test dokazuje da naše metode ispravno izračunavaju n-ti korijen.

4. Zaključak

Kao programeri, moramo razumjeti vrste podataka i njihovo ponašanje. Gore opisane matematičke metode djeluju jako dobro s prilično dobrom točnošću. Možete odabrati onaj koji najbolje odgovara vašem slučaju upotrebe. Kôd gornjeg rješenja nalazi se na GitHubu.