JavaのMathクラス
のsqrtメソッド
で平方根を求める方法を紹介します。
また、sqrtメソッド
を使わずに平方根を計算する方法も紹介します。
ここで、平方根とは数 \(a\) があるとき、2乗して \(a\) になるような数のことを指します。つまり \(x^{2}=a\) を満たす数 \(x\) が \(a\) の平方根になります。
メソッドの書式は以下になります。
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メソッド
を使わない方法として、数 \(x\) の平方根を求めたい時、 \(0\) から \(x\) までの平均を近似していくことで平方根を求める方法があります。この手法は二分法と呼ばれており、アルゴリズムの概要は以下のようになります。
例として、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メソッド
を使った方がコードが見やすく便利であることが分かります。以上で記事を終わりにします。