JavaScript/Math/expm1

Math.expm1(x) は、 を返します。ここで、 は自然対数の底(約2.718)です。この関数は、 が非常に小さい場合に Math.exp(x) - 1 よりも高い精度で結果を返します[1]

  • 引数 xNaN の場合、NaN を返します。
  • 引数 x+0 の場合、+0 を返します。
  • 引数 x-0 の場合、-0 を返します。
  • 引数 xInfinity の場合、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 を使用して を計算しています。ユーザーが入力した値が NaNInfinity の場合、適切に処理されます。

Math.expm1Math.exp(x) - 1 の比較

以下のプログラムは、Math.expm1Math.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.expm1Math.exp(x) - 1 の結果を比較しています。x が非常に小さい場合、Math.expm1 の方が高い精度で結果を返すことがわかります。

注意点

  • 精度: x が非常に小さい場合、Math.exp(x) - 1 は精度を失うことがありますが、Math.expm1 は高い精度を維持します。
  • 戻り値の範囲: Math.expm1 の戻り値は、-1 から Infinity の範囲です。

脚註

  1. これは、x が小さい場合に Math.exp(x) - 1 が精度を失う問題を解決するために設計されています。

外部リンク

カテゴリ:JavaScript
カテゴリ:JavaScript