JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【JavaScript入門】Math.sqrt()を使わずに平方根を計算する方法

はじめに

本記事では、JavaScriptにおいて Math.sqrt() 関数を使用せずに、数値の平方根を計算する関数を実装する方法を解説します。

平方根の計算は通常 Math.sqrt() を使えば一瞬ですが、アルゴリズムの学習や面接対策として「自力で実装する」ことは非常に良い練習になります。ここでは二分探索(バイナリサーチ)の考え方を応用して実装していきます。

実装コード

それでは、実際のコードを見てみましょう。

const square = (n, i, j) => {
   let mid = (i + j) / 2;
   let mul = mid * mid;
   if ((mul === n) || (Math.abs(mul - n) < 0.00001)){
      return mid;
   }else if (mul < n){
      return square(n, mid, j);
   }else{
      return square(n, i, mid);
   }
}
// n の平方根を求める関数
const findSqrt = num => {
   let i = 1;
   const found = false;
   while (!found){
      // num が完全平方数の場合
      if (i * i === num){
         return i;
      }else if (i * i > num){
         let res = square(num, i - 1, i);
         return res;
      };
      i++;
   }
}
console.log(findSqrt(33));

コードの解説

ステップ1:平方根が存在する範囲を絞り込む

まず、i = 1 から順番にループを回していきます。

  • i × i === num の場合: num は完全平方数であり、その平方根はちょうど i なので、i をそのまま返します。
  • i × i > num になった場合: 「i × i が初めて num を超えた」瞬間なので、num の平方根は必ず (i − 1) から i の間に存在することになります。

例えば num = 33 の場合、5 × 5 = 25 < 33、6 × 6 = 36 > 33 となるため、平方根は 5 〜 6 の間にあると分かります。

ステップ2:二分探索で平方根を特定する

範囲が絞り込めたら、square() 関数で二分探索を行います。

  1. 区間の中間値 mid = (i + j) / 2 を求めます。
  2. mid × mid が n と一致するか、誤差が 0.00001 未満になれば mid を答えとして返します。
  3. mid × mid < n であれば、答えは右半分(mid 〜 j)にあるので、区間を狭めて再帰呼び出しします。
  4. mid × mid > n であれば、答えは左半分(i 〜 mid)にあるので、同様に再帰呼び出しします。

この処理を繰り返すことで、効率よく平方根の近似値へと収束させることができます。

精度について

許容誤差を 0.00001 としているため、得られる結果は厳密な値ではなく近似的なものです。必要な精度に応じて、この閾値を調整してください。小さくするほど精度は向上しますが、その分計算回数も増えます。

実行結果

上記コードをコンソールで実行すると、以下の出力が得られます。

5.744562149047852

実際、√33 ≒ 5.744562... であり、正しく平方根が求められていることが確認できます。

まとめ

Math.sqrt() を使わずに平方根を求めるには、以下の手順が有効です。

  • 整数部分の範囲を線形探索で特定する
  • 二分探索を用いて小数部分を高精度に絞り込む

二分探索は O(log n) の計算量で動作するため、大きな数値に対しても高速に処理できるのが魅力です。ぜひ自分でもコードを書いて挙動を確かめてみてください。

  1. 【JavaScript】Math.sqrt()を使わずに非負整数の平方根を求める方法

    今回は、非負整数を受け取り、その平方根を計算して返すJavaScript関数を作成する方法を解説します。ただし、Math.sqrt()は使用しません。また、結果が浮動小数点数になる場合は、小数点以下を切り捨てて整数として返すものとします。 問題の概要 例えば、入力が「15」の場合、正確な平方根(約3.872)を返す必要はありません。それより小さい最も近い整数である「3」を返せばよいことになります。 このような問題に対しては、二分探索(バイナリサーチ)アルゴリズムを活用することで、効率的に平方根へと収束させることができます。 実装コード 実際のコードは以下の通りです。 num){

  2. JavaScriptでMath.sqrt()を使わずに数値の平方根を求める方法

    正の整数を唯一の引数として受け取り、その数値の平方根を計算して返すJavaScript関数を作成する必要があります。ただし、組み込みの Math.sqrt() メソッドは使用しないものとします。アプローチ:ニュートン法による反復計算Math.sqrt() を使わずに平方根を求める代表的な手法の一つが「ニュートン法(Newton-Raphson法)」です。これは、適当な初期値から始めて、次の更新式を繰り返し適用することで、真の平方根へと近づけていく方法です。xn+1 = xn − (xn² − num) / (2 × xn)この式は、「現在の推測値の2乗と目標値との誤差」を「接線の傾き(2 ×