JavaScript/Math/log1p

カテゴリ:Book:JavaScript#Math/log1p%20

Math.log1p(x) は、1 + x の自然対数(底が e の対数)を返します。これは、x が非常に小さい場合に Math.log(1 + x) よりも高い精度で結果を返します[1]

  • 引数 xNaN の場合、NaN を返します。
  • 引数 x+0 の場合、+0 を返します。
  • 引数 x-0 の場合、-0 を返します。
  • 引数 x-1 の場合、-Infinity を返します。
  • 引数 xInfinity の場合、Infinity を返します。
  • 引数 x-1 より小さい場合、NaN を返します。

log(1 + x) を計算するプログラム

以下のプログラムは、ユーザーが入力した値の log(1 + x) を計算します。

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

for (;;) {
  const x = f("値");
  const log1p = Math.log1p(x);
  if (!isNaN(log1p)) {
    alert(`log(1 + ${x}) は ${log1p.toFixed(3)} です。`);
    break;
  }
  alert("入力が大きすぎます。");
}

このプログラムでは、Math.log1p を使用して log(1 + x) を計算しています。ユーザーが入力した値が NaNInfinity の場合、適切に処理されます。

Math.log1pMath.log(1 + x) の比較

以下のプログラムは、Math.log1pMath.log(1 + x) の結果を比較します。

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

for (;;) {
  const x = f("値");
  const log1p = Math.log1p(x);
  const log = Math.log(1 + x);
  if (!isNaN(log1p) && !isNaN(log)) {
    alert(`log(1 + ${x}) は ${log1p.toFixed(3)} です。\nMath.log(1 + ${x}) は ${log.toFixed(3)} です。`);
    break;
  }
  alert("入力が大きすぎます。");
}

このプログラムでは、Math.log1pMath.log(1 + x) の結果を比較しています。x が非常に小さい場合、Math.log1p の方が高い精度で結果を返すことがわかります。

注意点

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

脚註

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

外部リンク

カテゴリ:Book:JavaScript#Math/log1p%20 カテゴリ:JavaScript
カテゴリ:Book:JavaScript カテゴリ:JavaScript カテゴリ:Pages using the JsonConfig extension