コンテンツにスキップ

JavaScript/Math/sqrt

出典: フリー教科書『ウィキブックス(Wikibooks)』

Math.sqrt(x) は、引数 x の平方根を返します[1]

  • 引数 x が負の値の場合、NaN を返します。
  • 引数 xNaN+0-0[2]、あるいは Infinity の場合、引数 x を返します。

[編集]

平方根を計算するプログラム

[編集]

以下のプログラムは、ユーザーが入力した数値の平方根を計算します。

const f = p => {
  for (;;) {
    a = prompt(`${p}は何ですか?`);
    if (!isNaN(a) && a >= 0)
      return a;
    alert(<code>${p}入力ミスがあります "${a}"</code>);
  }
}

for (;;) {
  const x = f("数値");
  const sqrt = Math.sqrt(x);
  if (sqrt !== Infinity) {
    alert(`数値 ${x} の平方根は ${sqrt.toFixed(3)} です。`);
    break;
  }
  alert("入力が大きすぎます。");
}

このプログラムでは、Math.sqrt を使用して数値の平方根を計算しています。ユーザーが負の値を入力した場合、NaN が返されます。

ユークリッド距離を計算するプログラム(非推奨)

[編集]

以下のプログラムは、2次元平面上の2点間のユークリッド距離を Math.sqrt を使用して計算しますが、これは非推奨の方法です。

const f = p => {
  for (;;) {
    a = prompt(`${p}は何cmですか?`);
    if (!isNaN(a))
      return a;
    alert(`${p}に、入力ミスがあります。 "${a}"`);
  }
}

for (;;) {
  const x1 = f("点1のx座標");
  const y1 = f("点1のy座標");
  const x2 = f("点2のx座標");
  const y2 = f("点2のy座標");

  const dx = x2 - x1;
  const dy = y2 - y1;

  const distance = Math.sqrt(dx ** 2 + dy ** 2);
  if (distance !== Infinity) {
    alert(`点1 (${x1}, ${y1}) と 点2 (${x2}, ${y2}) の距離は ${distance.toFixed(3)}cmです。`);
    break;
  }
  alert("入力が大きすぎます。");
}

このプログラムでは、Math.sqrt を使用してユークリッド距離を計算していますが、これは非推奨の方法です。理由は以下の通りです:

  1. オーバーフローのリスク: dxdy の値が大きい場合、dx ** 2dy ** 2 が非常に大きな値になり、オーバーフローが発生する可能性があります。
  2. アンダーフローのリスク: dxdy の値が非常に小さい場合、dx ** 2dy ** 2 が非常に小さな値になり、アンダーフローが発生する可能性があります。
  3. 精度の問題: 浮動小数点演算の誤差が累積し、結果の精度が低下する可能性があります。

推奨される方法

[編集]

ユークリッド距離を計算する場合、Math.hypot を使用することを強く推奨します。Math.hypot は、オーバーフローやアンダーフローのリスクを回避し、より高い精度で計算を行います。

const distance = Math.hypot(dx, dy);

この方法では、Math.hypot が内部で適切に処理を行うため、オーバーフローやアンダーフローの心配がありません。

脚註

[編集]
  1. ^ これは、数学的には x ** 0.5 と等しいのですが、浮動小数点演算として考えると x ** 0.5 は精度を担保できません。
  2. ^ sqrt(-0) は +0 を返しそうですが、直感に反して -0 を返します。

外部リンク

[編集]