Výpočet n-tého koreňa v Jave
1. Prehľad
Pokúšam sa nájsť n-tý koreň v Jave pomocou pow () je v niektorých prípadoch nepresná. Dôvodom je to, že dvojité čísla môžu na ceste stratiť presnosť. Preto pri riešení týchto prípadov bude možno potrebné vyleštiť výsledok.
2. Problém
Predpokladajme, že chceme vypočítať N-tý koreň ako:
základ = 125, exponent = 3
Inými slovami, ktoré číslo k sile 3 je 125?
Poskytuje sa to n-tý koreň čísla x sa rovná číslu x v sile 1 / n. Preložíme teda našu rovnicu na:
N-tý koreň = Math.pow (125, 1/3)
Výsledok je 4,999999999999999. A 4,999999999999999 na silu 3 nie je 125. Ako to teda napravíme?
3. Správny výpočet N-teho koreňa
Riešenie vyššie uvedeného problému je väčšinou matematickým riešením a je také jednoduché, ako je len možné. Je o tom dobre známe n-tý koreň čísla x sa rovná číslu x v sile 1 / n.
Existuje niekoľko spôsobov, ako využiť vyššie uvedenú rovnicu. Najskôr môžeme použiť a BigDecimal a implementovať našu verziu metódy Newton-Raphson. Po druhé, môžeme výsledok zaokrúhliť na najbližšie číslo a nakoniec môžeme definovať mieru chyby, kde budú výsledky prijateľné. Zameriame sa na posledné dva prístupy.
3.1. Okrúhly
Náš problém teraz použijeme zaokrúhľovanie. Zopakujme si náš predchádzajúci príklad a pozrime sa, ako môžeme získať správny výsledok:
public void whenBaseIs125AndNIs3_thenNthIs5 () {double nth = Math.round (Math.pow (125, 1,0 / 3,0)); assertEquals (5, n-tý, 0); }
3.2. Marža chyby
Tento prístup je veľmi podobný vyššie uvedenému. Potrebujeme len definovať prijateľnú chybovú maržu, predpokladajme 0,00001:
public void whenBaseIs625AndNIs4_thenNthIs5 () {double nth = Math.pow (625, 1,0 / 4,0); assertEquals (5, n-tý, 0,00001); }
Test dokazuje, že naše metódy správne vypočítajú n-tý koreň.
4. Záver
Ako vývojári musíme rozumieť dátovým typom a ich správaniu. Vyššie popísané matematické metódy fungujú naozaj dobre s celkom dobrou presnosťou. Môžete si vybrať ten, ktorý lepšie vyhovuje vášmu prípadu použitia. Kód vyššie uvedeného riešenia nájdete na GitHub.