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を返します。