矢沢久雄

 2進数の0と1しか取り扱えないコンピュータは,小数を表すためにトリッキーな方法を使っています。この方法は,浮動小数形式(ふどうしょうすうてんすうけいしき)と呼ばれ,IEEE(アイ・トリプル・イー,Institute of Electrical and Electronics Engineers=米国電気電子技術者協会)で規定されています。すなわち,トリッキーとはいえ,浮動小数形式が事実上の世界標準なのです。皆さんが,コンピュータのキーボードから3.14のような小数を入力すると,コンピュータの内部では浮動小数形式の情報として表されます。

●固定小数形式と浮動小数形式

図1●固定小数点数形式
 いつものように,まず10進数で小数の表現方法を考えてみましょう。小数とは,小数点を意味するドット(.)を持つ数のことです。当たり前のことですが,図1のようにドットの左側に1以上の数を書き,ドットの右側に1未満の数を書きます。小数点は,1以上の桁と1未満の桁の境目を表す記号だと言えます。

 このような表現方法を「固定小数形式(こていしょうすうてんすうけいしき)」と呼びます。小数点の位置が,その左右で1より大きいかどうかを表す固定的な境目となっているからです。

図2●浮動小数点数形式
 小数の表現方法は,もう一つあります。それは「浮動小数形式(ふどうしょうすうてんすうけいしき)」と呼ばれるものです。図2に例を示します。

 浮動小数形式では,「○○×△△の□□乗」というスタイルで小数を表します。このスタイルでは,同じ小数を様々な表現で表すことができます。例えば,3.14という数は,3.14×100,31.4×10-1,314.0×10-2,…などの様々な表現で表せます。これら3つの表現を見比べて分かるように,小数点の位置が変化できるから「浮動(固定でない)」というわけです。

●固定小数形式の2進数

 コンピュータでは,浮動小数点形式の2進数で小数を取り扱っています。それに関しては,後で説明しますので,まずはお遊びとして(ドットが使えるとして)固定小数形式の2進数について考えてみましょう。まず問題です。0.1という2進数は,10進数でいくつになるか分かりますか?

 答えは,0.5です。2進数では桁が上がると,重みが2倍されていきます。逆に考えれば,桁が下がると,重みが1/2倍になります。この重みと桁の数である1を掛けて,答えは0.5になります。

図3●小数点数でも重みを掛けて足す
 それでは次の問題です。0110.1101という2進数は,10進数でいくつになりますか?図3[拡大表示]を見ながら考えてください。「重みを掛けて足す」という考え方は,整数でも小数でも,2進数でも10進数でも,同じです。

●浮動小数形式の2進数

 いよいよ本題です。コンピュータは,小数を浮動小数形式の2進数で取り扱っています。0と1だけを使って,「○○×△△の□□乗」というスタイルを表現するために,複数桁の2進数を部分的に分けて使います。どのように分けるかを規定しているのいがIEEEという組織です。「○○×△△の□□乗」の○○の部分を「仮数部(かすうぶ)」と呼びます。△△の部分を「基数部(きすうぶ)」と呼びます。□□の部分を「指数部」と呼びます。基数部は,2進数では2に決まっているので省略し,仮数部,指数部,そして0ならプラス1ならマイナスを意味する符号部を使って小数を表します。複雑なスタイルなので,浮動小数形式では全体を「反転して1」というマイナス表現は使われません。

図4●単精度浮動小数点数と倍精度浮動小数点数の構造
 IEEEが規定する浮動小数形式には,64桁の2進数で小数を表す「倍精度浮動小数(ばいせいど・ふどうしょうすうてんすう)」と32桁の2進数で小数を表す「単精度浮動小数(たんせいど・ふどうしょうすうてんすう)」の2種類があります(図4[拡大表示])。桁数の多い倍精度浮動小数の方が,桁数の少ない単精度浮動小数より表現できる数の範囲が広くなります。

 「ぜんぜん分からない」という人もいるかもしれませんね。固定小数形式の2進数も,浮動小数形式の2進数も,それらを理解できないとコンピュータを使う上で困ったことになるわけではありませんので,どうぞ安心してください。ただし,一つだけ知っておいてほしいことがあります。それは,いずれの形式でも2進数で小数が表されているので,10進数のシンプルな小数でも2進数では正確に表せない場合があるということです。

 例えば,10進数のシンプルな小数0.1を2進数で表すと0.0001100110011001…という永遠に続く循環小数になります。ICのピンの数に限りがあるコンピュータで永遠に続く循環小数を表すことはできないので,途中で打ち切り,すなわち正確な値が表せないことになります。そのため,小数の計算をコンピュータに行わせると,正確な答えが得られないことがあるのです。これは,事実です。ちょっとだけ計算を間違えるコンピュータって,なかなか可愛いものだと思いませんか。

 実は,コンピュータの都合など考えずに,数学の問題として2進数を取り扱うなら,-0110のようにマイナス符号を使ったり,0.011のように固定小数形式を使ってもかまいません。ただし,皆さんは,コンピュータと仲良くなる手段として2進数を学んでいるのです。「マイナスは補数表現で,小数は浮動小数形式だ」と考えてコンピュータに接してください。きっと,いままで気付かなかったコンピュータの本当の姿が見えてくるはずです。次回は,2進数と相性のよい16進数を説明します。