Javaでn番目の根を計算する

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にあります。