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.


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