Az n-edik gyök kiszámítása Java-ban
1. Áttekintés
Megpróbálja megtalálni a Java n-edik gyökerét a hadifogoly() bizonyos esetekben pontatlan. Ennek oka az, hogy a dupla számok útközben elveszíthetik a pontosságot. Ezért szükség lehet az eredmény csiszolására ezen esetek kezeléséhez.
2. A probléma
Tegyük fel, hogy az N-edik gyököt a következőképpen akarjuk kiszámítani:
alap = 125, kitevő = 3
Más szavakkal, melyik szám a 3 hatványára 125?
Ezt feltéve az x szám n-edik gyöke megegyezik az x számával a hatványában 1 / n. Tehát lefordítjuk egyenletünket:
N-edik gyök = Math.pow (125, 1/3)
Az eredmény 4.999999999999999. És a 4,999999999999999 a 3 hatványára nem 125. Tehát hogyan tudjuk ezt kijavítani?
3. Az N-edik gyök helyes kiszámítása
A fenti probléma megoldása többnyire matematikai megoldás, és a lehető legegyszerűbb. Ez köztudott az x szám n-edik gyöke megegyezik az x számával a hatványában 1 / n.
A fenti egyenlet kiaknázására néhány mód van. Először használhatjuk a BigDecimal és implementáljuk a Newton-Raphson módszer változatát. Másodszor kerekíthetjük az eredményt a legközelebbi számra, és végül meghatározhatunk egy hibahatárt, ahol az eredmények elfogadhatóak lesznek. Összpontosítunk az utolsó két megközelítésre.
3.1. Kerek
Most kerekítéssel oldjuk meg a problémánkat. Használjuk újra előző példánkat, és nézzük meg, hogyan érhetjük el a megfelelő eredményt:
public void whenBaseIs125AndNIs3_thenNthIs5 () {double nth = Math.round (Math.pow (125, 1,0 / 3,0)); assertEquals (5., n., 0); }
3.2. Hibahatár
Ez a megközelítés nagyon hasonló a fentiekhez. Csak meg kell határoznunk egy elfogadható hibahatárt, tegyük fel, hogy 0.00001:
public void whenBaseIs625AndNIs4_thenNthIs5 () {double nth = Math.pow (625, 1,0 / 4,0); assertEquals (5., n., 0,00001); }
A teszt bizonyítja, hogy módszereink helyesen kiszámítják az n-edik gyököt.
4. Következtetés
Fejlesztőként meg kell értenünk az adattípusokat és azok viselkedését. A fent leírt matematikai módszerek nagyon jól, nagyon jó pontossággal működnek. Kiválaszthatja azt, amelyik jobban illeszkedik a használati esethez. A fenti megoldás kódja a GitHub oldalon található.