JavaScript/Math/expm1
Math.expm1(x)
は、 を返します。ここで、 は自然対数の底(約2.718)です。この関数は、 が非常に小さい場合に Math.exp(x) - 1
よりも高い精度で結果を返します[1]。
- 引数
x
がNaN
の場合、NaN
を返します。 - 引数
x
が+0
の場合、+0
を返します。 - 引数
x
が-0
の場合、-0
を返します。 - 引数
x
がInfinity
の場合、Infinity
を返します。 - 引数
x
が-Infinity
の場合、-1
を返します。
例
を計算するプログラム
以下のプログラムは、ユーザーが入力した値の を計算します。
const f = p => { for (;;) { a = prompt(`${p}は何ですか?`); if (!isNaN(a)) return a; alert(`${p}に、入力ミスがあります。 "${a}"`); } } for (;;) { const x = f("値"); const expm1 = Math.expm1(x); if (!isNaN(expm1)) { alert(`e^${x} - 1 は ${expm1.toFixed(3)} です。`); break; } alert("入力が大きすぎます。"); }
このプログラムでは、Math.expm1
を使用して を計算しています。ユーザーが入力した値が NaN
や Infinity
の場合、適切に処理されます。
Math.expm1
と Math.exp(x) - 1
の比較
以下のプログラムは、Math.expm1
と Math.exp(x) - 1
の結果を比較します。
const f = p => { for (;;) { a = prompt(`${p}は何ですか?`); if (!isNaN(a)) return a; alert(`${p}に、入力ミスがあります。 "${a}"`); } } for (;;) { const x = f("値"); const expm1 = Math.expm1(x); const expMinus1 = Math.exp(x) - 1; if (!isNaN(expm1) && !isNaN(expMinus1)) { alert(`e^${x} - 1 は ${expm1.toFixed(3)} です。\nMath.exp(${x}) - 1 は ${expMinus1.toFixed(3)} です。`); break; } alert("入力が大きすぎます。"); }
このプログラムでは、Math.expm1
と Math.exp(x) - 1
の結果を比較しています。x
が非常に小さい場合、Math.expm1
の方が高い精度で結果を返すことがわかります。
注意点
- 精度:
x
が非常に小さい場合、Math.exp(x) - 1
は精度を失うことがありますが、Math.expm1
は高い精度を維持します。 - 戻り値の範囲:
Math.expm1
の戻り値は、-1
からInfinity
の範囲です。
脚註
- ↑ これは、
x
が小さい場合にMath.exp(x) - 1
が精度を失う問題を解決するために設計されています。