Javaでのn番目のルートの計算
1. 概要
pow()を使用してJavaでn番目のルートを見つけようとすると、不正確になる場合があります。 その理由は、二重の数値が途中で精度を失う可能性があるためです。 したがって、これらのケースを処理するために結果を洗練する必要があるかもしれません。
2. 問題
N番目のルートを次のように計算するとします。
base = 125, exponent = 3
つまり、3の累乗の数は125ですか?
the n-th root of a number x is equal with the number x in the power of 1/nが提供されます。 したがって、方程式を次のように変換します。
N-th root = Math.pow(125, 1/3)
結果は4.999999999999999です。 また、4.999999999999999の3の累乗は125ではありません。 では、どうすれば修正できますか?
3. N番目のルートを正しく計算する
上記の問題の解決策は、ほとんどが数学的な回避策であり、それは可能な限り簡単です。 the n-th root of a number x is equal with the number x in the power of 1/nであることはよく知られています。
上記の方程式を活用する方法はいくつかあります。 まず、BigDecimalを使用して、Newton-Raphsonメソッドのバージョンを実装できます。 第二に、結果を最も近い数に丸め、最後に、結果が受け入れられる許容誤差を定義できます。 最後の2つのアプローチに焦点を当てます。
3.1. 円形
ここで、丸めを使用して問題を解決します。 前の例を再利用して、正しい結果を得る方法を見てみましょう。
public void whenBaseIs125AndNIs3_thenNthIs5() {
double nth = Math.round(Math.pow(125, 1.0 / 3.0));
assertEquals(5, nth, 0);
}
3.2. 誤差の範囲
このアプローチは上記と非常に似ています。 0.00001と仮定して、許容可能なエラーマージンを定義する必要があります。
public void whenBaseIs625AndNIs4_thenNthIs5() {
double nth = Math.pow(625, 1.0 / 4.0);
assertEquals(5, nth, 0.00001);
}
このテストは、メソッドがn番目のルートを正しく計算することを証明します。
4. 結論
開発者として、データ型とその動作を理解する必要があります。 上記の数学メソッドは、かなり良い精度で非常にうまく機能します。 ユースケースに適したものを選択できます。 上記のソリューションのコードはover on GitHubにあります。