Excelの「15桁の壁」を突破!有効桁数を超える巨大な数を計算する方法

Excelの「15桁の壁」を突破!有効桁数を超える巨大な数を計算する方法 数学・アルゴリズム実験室

はじめに:Excelの限界に挑戦しよう。

突然ですが、問題です。

 2^{100} (2の100乗)は、いくつになりますか?

手元の電卓アプリ(Windows, Mac, Linuxなど)で計算してみると、すぐに答えが出ます。

「1,267,650,600,228,229,401,496,703,205,376」

Excelの説明画像

…とてつもなく長い数字ですね。

では、これをExcelで計算してみましょう。
セルに =2^100 と入力してみてください。

結果は… 1.26765E+30

指数表記」になってしまいました。
セルの表示形式を「数値」に変えても…

Excelの説明画像

1267650600228230000000000000000

おや? 下の桁が全部「0」になっています。計算が合っていません!

Excelで2^100の計算はできないのでしょうか。

本記事では、無料のWeb版Excelを使用して検証および画像の作成を行っています。Windowsはもちろん、MacやLinuxの方もブラウザさえあれば挑戦できます!

なぜExcelは計算できないのか?

これはExcelのバグではありません。

Excel(というより多くのコンピュータ)が採用しているIEEE 754という規格の仕様です。

Excelは数値を「倍精度浮動小数点数」という形式で扱っています。

これは、ものすごく大きな数や小さな数を扱える代わりに、有効桁数が「約15桁」までという制限があります。

つまり、16桁目以降の細かい数字は「誤差」として切り捨てられ、0になってしまうのです。

Excelの説明画像

しかし、こんなことでは諦めません。

今回のテーマは、「Excelの制約を工夫で乗り越え、 2^{100} を1の位まで正確に表示する」こと!

このパズルを解くことで、データを工夫して扱う「応用力」と、桁上がりを制御する「論理的思考力」が身につきます。

さあ、限界突破の旅に出ましょう!

作戦:巨大な数字は「ブロック」に分けろ!

関数の詳細な仕様については、Microsoft公式のヘルプも参考にしてください。

 2^{100} の桁数は、=LOG10(2^100) で計算すると約「30.1」となるため、31桁の整数であることが分かります。

Excelの説明画像

15桁しか扱えないなら、10桁ずつ3つか4つのブロックに分けて計算し、最後に合体させればいいのです!

今回は余裕を持って、10桁×4ブロック(A列~D列)で計算します。

ステップ1:準備

1行目に初期値( 2^0 = 1 )を入力します。

  • A1: 0
  • B1: 0
  • C1: 0
  • D1: 1
Excelの説明画像

ステップ2:筆算のロジックを数式にする

2行目に、前の行を2倍する数式を入れます。

ただし、単に2倍するだけでは「10桁」を超えてしまいます。

そこで、「10桁を超えた分(繰り上がり)」を左の列に渡す処理を行います。

続いて、A2~D2セルに、以下の数式を入力してください。

A2セル(最上位ブロック):
=MOD(A1*2+INT((B1*2+INT((C1*2+INT(D1*2/10^10))/10^10))/10^10),10^10)

B2セル(上位ブロック):
=MOD(B1*2+INT((C1*2+INT(D1*2/10^10))/10^10),10^10)

C2セル(中位ブロック):
=MOD(C1*2+INT(D1*2/10^10),10^10)

D2セル(下位ブロック):
=MOD(D1*2,10^10)

Excelの説明画像

数式の解説(D列とC列の例)

D2(下位)のロジック:
MOD(D1*2, 10^10)

前の値を2倍します。もし10桁を超えても、MOD(..., 10^10) で下10桁だけを残します。

Excelの説明画像

C2(中位)のロジック:
MOD(C1*2 + INT(D1*2/10^10), 10^10)

1. C1*2: 自分の桁を2倍します。
2. INT(D1*2/10^10): 右隣(D列)で2倍した時にあふれた分(繰り上がり)を受け取って足します。

Excelの説明画像

3. MOD(..., 10^10): 足した結果がさらにあふれたら、それは左隣(B列)に任せて、自分は下10桁だけを残します。

これをA列までリレーさせていくわけです!

ステップ3:フィルコピーして完成!

入力したA2:D2を選択し、101行目までガガーッと下にオートフィル(コピー)してください。

1行目が「0乗」なので、101行目が「100乗」の結果になります。

Excelの説明画像

最後に、任意のセルでこれらを連結します。

ただし、単純に & で繋ぐと、途中の(例)「0000000123」が「123」になってしまい桁がズレます。

※今回(2^100)の場合は問題ありませんが、そのようなケースを想定します。

必ず TEXT関数 で10桁のゼロ埋めを行いましょう。

=TEXT(A101,"0")&TEXT(B101,"0000000000")&TEXT(C101,"0000000000")&TEXT(D101,"0000000000")

結果は…
1267650600228229401496703205376

Excelの説明画像

電卓の結果と見比べてみてください。

Excelの説明画像

一桁の狂いもなく、完全一致しているはずです!
Excelの15桁の壁を、知恵と工夫で突破しました!


ミッション2:一撃で解く!作業列なしの数式

「フィルコピーが面倒くさい!」

そんな方のために、最新のExcel関数(REDUCE & LAMBDA)を使って、この計算を一発で行う数式を紹介します。

数式

=LET(
初期配列, {0,0,0,1},
ブロック桁数, 10^10,
計算結果, REDUCE(初期配列, SEQUENCE(100), LAMBDA(現在の値,_,
LET(
倍増, 現在の値 * 2,
繰り上がり, INT(倍増 / ブロック桁数),
シフト処理, HSTACK(DROP(繰り上がり, , 1), 0),
MOD(倍増 + シフト処理, ブロック桁数)
)
)),
TEXT(INDEX(計算結果, 1), "0") & CONCAT(TEXT(DROP(計算結果, , 1), "0000000000"))
)

数式の解読

※やっていることは上記とほとんど同じなので画像は省略します!

1. 初期配列: {0, 0, 0, 1} という4つのブロックを用意します。

2. REDUCE & SEQUENCE(100): 初期配列に対して、以下の計算を「100回」繰り返します。

3. LAMBDA内の処理:

  • 倍増: 配列全体を2倍します。
  • 繰り上がり: 各ブロックで10桁を超えた分(オーバーフロー)を計算します。
  • シフト処理: HSTACKDROPを使って、繰り上がり分を「一つ左のブロック」に移動させます。(右端のD列の繰り上がりはC列へ、C列はB列へ…)
  • MOD(...): 倍増した値に、右からの繰り上がりを足し、最後に自分自身が10桁に収まるように余りを取ります。

4. TEXT & CONCAT: 最後に、先ほどと同じようにTEXT関数でゼロ埋めして連結します。

Excelの説明画像

やっていることはフィルコピー版と同じ「筆算の繰り返し」ですが、それをメモリ上だけで完結させているのです。美しいですね!

おまけ:この数字、どう読むの?

せっかくなので、この31桁の数字を日本語で読んでみましょう。

126穣 7650𥝱 6002垓 2822京 9401兆 4967億 320万 5376
(126じょう 7650じょ 6002がい 2822けい…)

」や「(けい)」までは聞きますが、「(がい)」「𥝱(じょ)」「(じょう)」なんて単位、見たことありますか?

ちなみに、この  2^{100} (約  1.2 \times 10^{30} )という数字に近いものを探すと…

  • 観測可能な宇宙にある星の数:約  10^{24} 個(まだまだ!)
  • 人体の原子の数:約  10^{27} 個(惜しい!)

※いずれも諸説あり。

星の数よりも遥かに大きく、体中の原子の数の1000倍。

そんな天文学的な数字を、Excelのセルの中に正確に封じ込めたのです。

まとめ:制限があるからこそ面白い

「Excelは15桁までしか計算できない」

それは事実ですが、諦める理由にはなりません。

仕組みを理解し、ブロックに分けて統治する。

この考え方は、プログラミングや大規模データの処理にも通じる重要なスキルです。

何より、こんな巨大な数字がピッタリ合った時の快感はたまりませんよね!

ぜひ、皆さんのExcelでも  2^{100} の扉を開いてみてください!

他の、数学系のネタも是非ご覧ください。
Excelで行列計算!連立方程式を一瞬で解く5つの関数テクニック
【Excel】素因数分解を関数だけで実装?LAMBDAと再帰で挑むアルゴリズム

タイトルとURLをコピーしました