JavaScript のエラー: BigInt 負の指数


JavaScript のエラー: BigInt 負の指数

このエラーは、JavaScript の BigInt 型で負の指数を使用しようとした場合に発生します。BigInt 型は、通常の JavaScript 整数型 (Number) よりも大きな整数値を扱うために使用されます。

詳細

JavaScript の BigInt 型は、符号付き整数値を表すことができます。しかし、負の指数を使用することはできません。これは、BigInt 型の指数は、常に非負の整数である必要があるためです。

このエラーは、通常、BigInt 型の値を指数演算子 (**) で操作しようとしたときに発生します。たとえば、次のコードはエラーを生成します。

const bigInt = BigInt('12345678901234567890');
console.log(bigInt ** -1);

解決策

このエラーを解決するには、負の指数を使用しないようにする必要があります。代わりに、正の指数を使用するか、Math.pow() 関数を使用して指数演算を実行することができます。

たとえば、次のコードは正しく動作します。

const bigInt = BigInt('12345678901234567890');
console.log(bigInt ** 2); // 15474235476716065625

または、次のコードは Math.pow() 関数を使用して同じ結果を得ることができます。

const bigInt = BigInt('12345678901234567890');
console.log(Math.pow(bigInt, -1)); // 0.00000000000000000000080751907892689536

以下のコードは、BigInt 型の指数演算の例を示しています。

const bigInt = BigInt('12345678901234567890');
console.log(bigInt ** 2); // 15474235476716065625
console.log(bigInt ** 0); // 1
console.log(bigInt ** 1); // 12345678901234567890
console.log(bigInt ** -1); // Error: BigInt negative exponent

このコードを実行すると、次の出力が表示されます。

15474235476716065625
1
12345678901234567890
Error: BigInt negative exponent


const bigInt = BigInt('12345678901234567890');

console.log(bigInt ** 2); // 15474235476716065625
console.log(bigInt ** 0); // 1
console.log(bigInt ** 1); // 12345678901234567890
console.log(bigInt ** -1); // Error: BigInt negative exponent

// Math.pow() 関数を使用した指数演算
console.log(Math.pow(bigInt, -1)); // 0.00000000000000000000080751907892689536
console.log(Math.pow(bigInt, 0.5)); // 3518632115344827927.98491945844827633403
15474235476716065625
1
12345678901234567890
Error: BigInt negative exponent
0.00000000000000000000080751907892689536
3518632115344827927.98491945844827633403

説明

このコードは以下の処理を実行します。

  1. bigInt という名前の BigInt 型変数を、文字列リテラル "12345678901234567890" を使って初期化します。
  2. bigInt を 2 乗して、結果をコンソールに出力します。
  3. bigInt を -1 乗しようとしますが、エラーが発生します。これは、BigInt 型では負の指数を使用できないためです。
  4. Math.pow() 関数を使用して、bigInt を -1 乗し、結果をコンソールに出力します。


このエラーを回避するには、以下の代替方法を検討してください。

絶対値を使用する

負の指数を使用する代わりに、絶対値を使用して同じ結果を得ることができます。

const bigInt = BigInt('12345678901234567890');
const negativeExponent = -2;

// エラーが発生するコード
console.log(bigInt ** negativeExponent);

// 絶対値を使用して同じ結果を得るコード
const positiveExponent = Math.abs(negativeExponent);
console.log(bigInt ** positiveExponent);

Math.pow() 関数を使用する

Math.pow() 関数は、任意の基数と指数を受け入れて、べき乗を計算します。BigInt 型の値に対して負の指数を使用する場合でも、この関数を使用することができます。

const bigInt = BigInt('12345678901234567890');
const negativeExponent = -2;

// エラーが発生するコード
console.log(bigInt ** negativeExponent);

// Math.pow() 関数を使用して同じ結果を得るコード
console.log(Math.pow(bigInt, negativeExponent));

条件分岐を使用して指数を検証する

指数が負の場合、エラーメッセージをスローするか、デフォルト値を返すようにコードを構成することができます。

const bigInt = BigInt('12345678901234567890');
const exponent = -2;

if (exponent < 0) {
  console.error('負の指数は許可されていません');
  // デフォルト値を返す
  return 1n;
}

console.log(bigInt ** exponent);

カスタム関数を作成する

BigInt 型専用のべき乗計算関数を作成することもできます。この関数は、指数が負の場合はエラーをスローするか、デフォルト値を返すようにすることができます。

function bigIntPow(base, exponent) {
  if (exponent < 0) {
    throw new Error('負の指数は許可されていません');
  }

  // べき乗計算を実行
  let result = 1n;
  for (let i = 0; i < exponent; i++) {
    result *= base;
  }

  return result;
}

const bigInt = BigInt('12345678901234567890');
const exponent = -2;

try {
  console.log(bigIntPow(bigInt, exponent));
} catch (error) {
  console.error(error.message);
}

BigInt 型で負の指数を使用する代わりに、上記の代替方法のいずれかを使用することができます。これらの方法は、エラーを回避し、意図した結果を得るのに役立ちます。