【Java】sqrtメソッドで平方根(ルート√)を求める方法

JavaのMathクラスのsqrtメソッドで平方根を求める方法を紹介します。
また、sqrtメソッドを使わずに平方根を計算する方法も紹介します。
ここで、平方根とは数 \(a\) があるとき、2乗して \(a\) になるような数のことを指します。つまり \(x^{2}=a\) を満たす数 \(x\) が \(a\) の平方根になります。
sqrtメソッドの書式
メソッドの書式は以下になります。
1Math.sqrt(double a);
2Math.sqrt(4); // 2が返る引数の平方根が返ってきます。戻り値の型はdouble型になります。
正の無限大の時は正の無限大がそのまま返されます。また、引数が負の数値である場合はNaN(Not a Number/非数)を返します(NaNが引数の時も同様です)。
似た機能を持つメソッドに、立方根を計算するcbrtメソッドがあるので注意しましょう。
メソッドの使用例
メソッドの使用例をサンプルコードで示します。
1public class SqrtTest1 {
2 public static void main(String[] args) {
3 System.out.println("4の平方根:" + Math.sqrt(4));
4 System.out.println("9.0の平方根:" + Math.sqrt(9.0));
5 System.out.println("10の平方根:" + Math.sqrt(10));
6 System.out.println("-1の平方根:" + Math.sqrt(-1));
7 System.out.println("0の平方根:" + Math.sqrt(0));
8 System.out.println("正の無限大の平方根:" + Math.sqrt(Double.POSITIVE_INFINITY));
9 System.out.println("NaNの平方根:" + Math.sqrt(Double.NaN));
10 }
11}実行結果が以下になります。
14の平方根:2.0
29.0の平方根:3.0
310の平方根:3.1622776601683795
4-1の平方根:NaN
50の平方根:0.0
6正の無限大の平方根:Infinity
7NaNの平方根:NaNそれぞれの数字の平方根が、double型で出力されていることが分かります。
sqrtメソッドを使わずに平方根を計算する
sqrtメソッドを使わない方法として、数 \(x\) の平方根を求めたい時、 \(0\) から \(x\) までの平均を近似していくことで平方根を求める方法があります。この手法は二分法と呼ばれており、アルゴリズムの概要は以下のようになります。
- 変数 \(\text{num1}=0\) 、 \(\text{num2}=x\) とし、 \(\text{num1}\) と \(\text{num2}\) の平均 \(\text{mid}\) を求める
- \(\text{mid}^{2}=x\) の時、処理を終了する
- \(\text{mid}^{2} < x\) だったら \(\text{num2}=\text{mid}\) とする
- \(x < \text{mid}^{2}\) のとき、 \(\text{num1}=\text{mid}\) とする
- \(\text{mid}^{2}=x\) か、ループの規定回数に達するまで1、2を繰り返す
例として、10の平方根を求めるサンプルコードを以下に示します。近似の回数は最大1000回にしています。また、double型は誤差が発生するので、アルゴリズム2.の比較時は差がある程度の数値を下回るかどうかで判定します。
1public class SqrtTest2 {
2 public static void main(String[] args) {
3 double x = 10;
4 double num1 = 0;
5 double num2 = x;
6 double mid;
7
8 for (int i = 0; i < 1000; i++) {
9 mid = (num2 + num1) / 2;
10 if (Math.abs(mid * mid - x) < 0.00000000000001) {
11 System.out.println(x + "の平方根:" + mid);
12 break;
13 } else if (mid * mid < x) {
14 num1 = mid;
15 } else if (x < mid * mid) {
16 num2 = mid;
17 }
18 }
19 }
20}実行結果が以下になります。
110.0の平方根:3.16227766016838先ほどの出力結果とほぼ数値が出力されたことが分かります。平方根が無理数の場合、繰り返し処理は最大まで達して処理を終了します。
ここまで色々と書きましたが、この方法だとコードが長いので普通にsqrtメソッドを使った方がコードが見やすく便利であることが分かります。以上で記事を終わりにします。