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

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

JavaMathクラスsqrtメソッド平方根を求める方法を紹介します。

また、sqrtメソッドを使わずに平方根を計算する方法も紹介します。

ここで、平方根とは数 \(a\) があるとき、2乗して \(a\) になるような数のことを指します。つまり \(x^{2}=a\) を満たす数 \(x\) が \(a\) の平方根になります。

sqrtメソッドの書式

メソッドの書式は以下になります。

sqrtメソッドの書式
1Math.sqrt(double a);
2Math.sqrt(4); // 2が返る

引数の平方根が返ってきます。戻り値の型はdouble型になります。

正の無限大の時は正の無限大がそのまま返されます。また、引数が負の数値である場合はNaN(Not a Number/非数)を返します(NaNが引数の時も同様です)。

似た機能を持つメソッドに、立方根を計算するcbrtメソッドがあるので注意しましょう。

メソッドの使用例

メソッドの使用例をサンプルコードで示します。

SqrtTest1.java
 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\) までの平均を近似していくことで平方根を求める方法があります。この手法は二分法と呼ばれており、アルゴリズムの概要は以下のようになります。

アルゴリズム
  1. 変数 \(\text{num1}=0\) 、 \(\text{num2}=x\) とし、 \(\text{num1}\) と \(\text{num2}\) の平均 \(\text{mid}\) を求める
  2. \(\text{mid}^{2}=x\) の時、処理を終了する
  3. \(\text{mid}^{2} < x\) だったら \(\text{num2}=\text{mid}\) とする
  4. \(x < \text{mid}^{2}\) のとき、 \(\text{num1}=\text{mid}\) とする
  5. \(\text{mid}^{2}=x\) か、ループの規定回数に達するまで1、2を繰り返す

例として、10の平方根を求めるサンプルコードを以下に示します。近似の回数は最大1000回にしています。また、double型は誤差が発生するので、アルゴリズム2.の比較時は差がある程度の数値を下回るかどうかで判定します。

SqrtTest2.java
 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メソッドを使った方がコードが見やすく便利であることが分かります。以上で記事を終わりにします。

参考文献