コンピュータ内のデータその 1: 2進法と浮動小数点

今のコンピュータを実現しているのは, 多量のスィッチ (任天堂のゲーム機ではなく,電流を流したり切ったりするやつ)です. 現在は, そのスィッチは半導体素子を用いて実現されていますが, 過去には, 電磁石でスィッチの開閉をする「リレー式計算機」も作られました. 今の 1台のコンピュータの中にあるスィッチの個数は, 億単位です.

電気を用いた計算では, 電圧が有る無しで数の 1, 0 の状態を作り出します. これと, スィッチを組み合わせて, 様々な計算をすることができる電気回路を作ることができます. 即ち, コンピュータの内部は, 2進法の数だけが存在する世界です 1.

まず, 一般的な数の表記(記数法)について述べます2.

通常, 数は 789.012のように書かれます. この意味は, $7\times 10^2 + 8\times 10^1 + 9\times 10^0 + 0\times 10^{-1}
+1\times 10^{-2}+2\times 10^{-3}$の 10のベキ乗の係数を順に並べて 書いたもので, 10進法表記と言います. 10のことをこの表記の基数と言います. 10進法表記では, 数を表すのに 0 〜 9 の 10個の文字を用います. 10 を基数とするのは, ヒトの両手の指の総数が 10本であるからだと考えられていますが, 数学的に合理的である事が証明されている訳ではないと思います. ヨーロッパ系言語の 数詞を見ますと, 必ずしも言葉は 10進法ではありません. 従って, 10進法は 歴史的には割に新しい数の表記法です. 基数を 10にするのは人間的な都合ですが, 10以外の基数であっても, 上のような数の表記は, 筆算が可能であると言う意味では 合理的です. 例えば, ローマ数字を用いたかけ算を考えると, 実行がとても 難しい事は, ちょっとやればわかります(ローマ数字については, 各自調べて下さい).

上の基数を 2 に変えたものが, 2進法です. 2進法では, 数を表すのに 0, 1の 2つの文字しか用いません. 2進法で 101.011 は, $1\times 2^2 + 0\times 2^1 + 1\times 2^0 + 0\times 2^{-1}+1\times 2^{-2} + 1\times 2^{-3}$ の意味で, これを 10進法で書くと $\displaystyle{\frac{43}8}=5.375$ になります.

コンピュータの世界では2進法は自然なのですが3, 人間に取っては小さい数を表すのにも多量の桁数を必要とするため, 双方で便利な記法として$2^4=16$を基数とする 16進法もよく用いられます. この場合, 数を表記するのに 16個の文字が必要となりますが, 数字としては存在しないので, A, B, C, D, E, Fをそれぞれ 10進法の 10, 11, 12, 13, 14, 15 を表す文字として用います 4.

もう 1つ, (数学ではあまり現れませんが)浮動小数点表記というものがあります. 化学で習ったアボガドロ数 $6.02\times 10^{23}$や物理で習った 電気素量(電子 1個の電荷) $1.6\times 10^{-19}$クーロンです. これらは, 人間の普段の暮らしからすると大きすぎたり, (絶対値が)小さすぎたり する値で, 表記の桁数を少なくするために, 上の様に数桁の有効数字に 10のベキ乗を掛けた形で書かれます. このような表記の仕方を, 浮動小数点数(浮動小数点表記)と言います. 左側にある有効数字の部分を仮数部, 右側にある 10のベキの部分を指数部と言います. コンピュータでも浮動小数点数の計算は可能であり, 上の例では 10進法で表記していますが, コンピュータでの実際の計算では, 仮数部, 指数部共に 2を基数とする数に変換されて計算されます.

通常の数, 浮動小数点数ともに, コンピュータの中にあるのは有限桁数の数であり, 数学のような理想的な整数や実数が計算機で実現できている訳ではありません. ただし, 普段の人間の実用に必要な範囲での数の世界は, 実現されていると言って良いでしょう.


2021-04-22