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
説明
このコードは以下の処理を実行します。
bigInt
という名前の BigInt 型変数を、文字列リテラル "12345678901234567890" を使って初期化します。bigInt
を 2 乗して、結果をコンソールに出力します。bigInt
を -1 乗しようとしますが、エラーが発生します。これは、BigInt 型では負の指数を使用できないためです。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
型で負の指数を使用する代わりに、上記の代替方法のいずれかを使用することができます。これらの方法は、エラーを回避し、意図した結果を得るのに役立ちます。