JavaScript/Math/imul

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

Math.imul(x, y) は、引数 xy を32ビット整数として扱い、その積を返します。これは、C言語の int 型の乗算と同様の動作をします[1]

  • 引数 x または yNaN の場合、0 を返します。
  • 引数 x または yInfinity または -Infinity の場合、0 を返します。
  • 引数 x または y+0 または -0 の場合、0 を返します。

32ビット整数の乗算を計算するプログラム

以下のプログラムは、ユーザーが入力した2つの値の32ビット整数の乗算を計算します。

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

for (;;) {
  const x = f("値1");
  const y = f("値2");
  const imul = Math.imul(x, y);
  if (!isNaN(imul)) {
    alert(`${x}${y} の32ビット整数の積は ${imul} です。`);
    break;
  }
  alert("入力が大きすぎます。");
}

このプログラムでは、Math.imul を使用して2つの値の32ビット整数の乗算を計算しています。ユーザーが入力した値が NaNInfinity の場合、適切に処理されます。

32ビット整数の乗算と通常の乗算の比較

以下のプログラムは、Math.imul と通常の乗算の結果を比較します。

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

for (;;) {
  const x = f("値1");
  const y = f("値2");
  const imul = Math.imul(x, y);
  const normal = x * y;
  if (!isNaN(imul) && !isNaN(normal)) {
    alert(`${x}${y} の32ビット整数の積は ${imul} です。\n通常の乗算では ${normal} です。`);
    break;
  }
  alert("入力が大きすぎます。");
}

このプログラムでは、Math.imul と通常の乗算の結果を比較しています。Math.imul は、32ビット整数の乗算を行うため、結果が32ビット整数の範囲に収まらない場合、通常の乗算とは異なる結果になることがわかります。

注意点

  • 32ビット整数: Math.imul は、引数 xy を32ビット整数として扱います。このため、結果が32ビット整数の範囲に収まらない場合、予期しない結果になることがあります。
  • 精度: Math.imul は、32ビット整数の乗算を行うため、64ビット浮動小数点数の乗算よりも精度が低くなります。

脚註

  1. これは、32ビット整数の乗算を行い、結果を32ビット整数として返します。

外部リンク

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