JavaScript/Math/sqrt
表示
< JavaScript | Math
Math.sqrt(x)
は、引数 x
の平方根を返します[1]。
- 引数
x
が負の値の場合、NaN
を返します。 - 引数
x
がNaN
、+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
を使用してユークリッド距離を計算していますが、これは非推奨の方法です。理由は以下の通りです:
- オーバーフローのリスク:
dx
やdy
の値が大きい場合、dx ** 2
やdy ** 2
が非常に大きな値になり、オーバーフローが発生する可能性があります。 - アンダーフローのリスク:
dx
やdy
の値が非常に小さい場合、dx ** 2
やdy ** 2
が非常に小さな値になり、アンダーフローが発生する可能性があります。 - 精度の問題: 浮動小数点演算の誤差が累積し、結果の精度が低下する可能性があります。
推奨される方法
[編集]ユークリッド距離を計算する場合、Math.hypot
を使用することを強く推奨します。Math.hypot
は、オーバーフローやアンダーフローのリスクを回避し、より高い精度で計算を行います。
const distance = Math.hypot(dx, dy);
この方法では、Math.hypot
が内部で適切に処理を行うため、オーバーフローやアンダーフローの心配がありません。
脚註
[編集]- ^ これは、数学的には
x ** 0.5
と等しいのですが、浮動小数点演算として考えるとx ** 0.5
は精度を担保できません。 - ^ sqrt(-0) は
+0
を返しそうですが、直感に反して-0
を返します。