JavaScript - BigInt: Handling Really Big Numbers

こんにちは、未来のプログラマーさんたち!今日は、JavaScriptの世界で非常に大きな数を扱う興奮する旅に出かけます。シートベルトを締めて、BigIntの魅力的な領域に飛び込んでみましょう!

JavaScript - BigInt

What is BigInt?

星を数えていると、突然計算機が「無限大」と表示するかもしれません。フラストレーションが溜まりますよね?それがBigIntが登場する場です!

BigIntは、任意の長さの整数を表現できるJavaScriptの特別な数値型です。通常の数とは異なり、制限がないため、あなたの想像力(またはコンピュータのメモリ)に応じて非常に大きな数を扱うことができます。

Why do we need BigInt?

JavaScriptでは、通常の数は64ビットで保存されており、最大の安全な整数値は9,007,199,254,740,991です。これは大きな数ですが、計算の世界ではもっと大きな数が必要な場合があります!

この制限を超えるとどうなるか見てみましょう:

console.log(9007199254740991 + 1); // 9007199254740992
console.log(9007199254740991 + 2); // 9007199254740992 (同じ結果)

JavaScriptはこの制限を超える数を正確に表現できません。ここでBigIntが輝きます!

Declaration and Initialization

BigIntを作成するのは簡単です。以下の2つの方法があります:

  1. 整数の末尾に 'n' を追加する
  2. BigInt()関数を使用する

両方を試してみましょう:

const bigNumber1 = 1234567890123456789012345678901234567890n;
const bigNumber2 = BigInt("9007199254740991");

console.log(bigNumber1); // 1234567890123456789012345678901234567890n
console.log(bigNumber2); // 9007199254740991n

末尾の 'n' に注意してください。これでJavaScriptがそれがBigIntであることを認識します!

Basic Operations

大きな数を手に入れたので、少し数学をしましょう!

const a = 1234567890n;
const b = 9876543210n;

console.log(a + b);  // 11111111100n
console.log(a - b);  // -8641975320n
console.log(a * b);  // 12193263111263526900n
console.log(a / b);  // 0n (整数除法)
console.log(a % b);  // 1234567890n

BigIntは常に整数です。除法を行う際には、結果は最も近い整数に丸めされます。

Comparison

BigIntの比較は通常の数と同じです:

console.log(5n > 4n);   // true
console.log(5n < 4n);   // false
console.log(5n === 5);  // false (異なる型)
console.log(5n == 5);   // true (型変換)

最後の2行に注意してください。BigIntと通常の数は == を使用すると等しいと見なされますが、=== を使用すると等しくありません。これは === が値と型の両方を確認するためです。

Conversions

時々、BigIntと通常の数の間で変換する必要があります。以下のようにします:

const bigNum = 123456789n;
const regularNum = Number(bigNum);

console.log(regularNum);  // 123456789

const backToBigInt = BigInt(regularNum);
console.log(backToBigInt);  // 123456789n

大きなBigIntを通常の数に変換する際には、精度を失う可能性があることに注意してください!

Examples

実際の例でBigIntの知識を活かしてみましょう:

1. Calculating Factorials

function factorial(n) {
if (n === 0n) return 1n;
return n * factorial(n - 1n);
}

console.log(factorial(20n));  // 2432902008176640000n

この関数は、通常のJavaScriptの数では計算不可能な非常に大きな数の階乗を計算できます!

2. Working with Really Large Prime Numbers

function isPrime(n) {
if (n <= 1n) return false;
for (let i = 2n; i * i <= n; i++) {
if (n % i === 0n) return false;
}
return true;
}

const largeNumber = 2n ** 100n - 1n;
console.log(isPrime(largeNumber) ? "Prime" : "Not Prime");  // Not Prime

この関数は、通常のJavaScriptの数の限界を超える数の素数判定ができます!

Error Handling with BigInt

BigIntを使用する際には、以下の点に注意してください:

try {
const result = 1n + 1;  // これはエラーを発生します
} catch (error) {
console.log("Error:", error.message);  // Cannot mix BigInt and other types
}

try {
const result = Math.sqrt(4n);  // これはもともとエラーを発生します
} catch (error) {
console.log("Error:", error.message);  // Cannot convert a BigInt value to a number
}

Remember, BigInts can only be used with other BigInts for arithmetic operations, and many Math functions don't support BigInts.

BigInt Methods

以下は、最も一般的に使用されるBigIntメソッドの表です:

Method Description Example
BigInt() Creates a BigInt value BigInt(123)
BigInt.asIntN() Wraps a BigInt value to a signed integer between -2^(n-1) and 2^(n-1)-1 BigInt.asIntN(3, 5n) // 5n
BigInt.asUintN() Wraps a BigInt value to an unsigned integer between 0 and 2^n-1 BigInt.asUintN(3, 5n) // 5n
BigInt.prototype.toString() Returns a string representation of a BigInt value (123n).toString() // "123"
BigInt.prototype.valueOf() Returns the primitive value of a BigInt object Object(123n).valueOf() // 123n

そして、皆さん!大きな数を扱う力を手に入れました。大きな力には大きな責任が伴います - BigIntを賢く使用しましょう!

ハッピーコーディング、そしてあなたの夢がいつも大きな数であることを願っています!

Credits: Image by storyset