1. 概要
pow()を使用してJavaでn番目のルートを見つけようとすると、不正確になる場合があります。 その理由は、二重の数値は途中で精度を失う可能性があるためです。 したがって、これらのケースを処理するために結果を磨く必要があるかもしれません。
2. 問題
N番目のルートを次のように計算するとします。
base = 125, exponent = 3
つまり、3の累乗の数は125ですか?
数値xのn乗根は、1 /nの累乗の数値xと等しいと規定されています。 したがって、方程式を次のように変換します。
N-th root = Math.pow(125, 1/3)
結果は4.99999999999999です。 また、4.99999999999999の3の累乗は125ではありません。 では、どうすればそれを修正できますか?
3. N番目のルートを正しく計算する
上記の問題の解決策は、ほとんどが数学的な回避策であり、それは可能な限り簡単です。 数xのn乗根が1/nの累乗の数xと等しいことはよく知られています。
上記の式を活用する方法はいくつかあります。 まず、 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. 結論
開発者として、データ型とその動作を理解する必要があります。 上記の数学の方法は、かなり正確にうまく機能します。 ユースケースに適したものを選択できます。 上記のソリューションのコードは、GitHubのにあります。