PR

小数点を含む値の内部表現は面倒くさいが
かしこい仕組みを満載

 整数型データは値を2進数に変換して,そのままメモリーに格納する,シンプルでわかりやすい方式です。それに比べて小数点を含む数値データ,浮動小数点型のデータは,なんとも難解で面倒くさい方法を利用します。どうしてこんな面倒な方法を採るの? と思うかもしれませんが,コンピュータにとってはメモリー空間を有効に利用できる,非常に都合がよい方法なのです。

小数点を含む数値を2進数で表す方法

  図1●メモリーの構造と,データ型による内部表現

 コンピュータはどんなデータも2進数で表します。それは小数点を含む数値データでも同様です図1[拡大表示]。まず手始めに10進数「10.625」という数値データを2進数で表現してみましょう。まず小数点の上,「10」の部分だけを2進数に変換します。

10 = 8 * 1 + 4 * 0 + 2 * 1 + 1 * 0

ですから,「1010」ですね。次は小数点以下の「0.625」の部分です。小数点から上は2進数のケタがあがるごとに1,2,4,8…と2倍ずつ増えていったのに対し,小数点以下の部分は0.5,0.25,0.125,0.0625…と1/2倍ずつ減っていきます。

0.625 = 0.5 * 1 + 0.25 * 0 + 0.125 * 1

ですから,小数点以下の部分は「.101」と書けます。これらを合体して,10進数の10.625は,2進数で「1010.101」と書くことができます。

 さて,左図では浮動小数点型データは符号部,仮数部,指数部の三つからなると書き,123.45を「+1.2345×102」と表現しました。10進数で「+10.625」を「+1.0625×101」と書けるのと同様に,2進数の「+1010.101」は「+1.010101×23」と書くことができます。「+0.1010101×24」とも書けますが,小数点以上のケタを一つ,値を1にするのが決まりと覚えてください。いつも1.…×10nという形です。

データ節約の仕組み2連発

 さて,ここからがポイントです。符号部は1ビットで+か-を表すだけなのでとくに難しいことはありません。仮数部と指数部にデータを節約する仕組みが込められています。

 まず仮数部です。1.…×10nという形で表すことは先に説明しました。仮数部に収めるデータは,この左端の1を取ってしまいます。いつも1,という決まりですから,わかりきった値に貴重なメモリーの1ビットを費やすわけにはいかないのです。したがって,1.010101×24の仮数部に入るデータは,小数点以下の「010101」です。仮数部は23ビットあるので,残りの17ビットには0を埋めます。逆に言えば,2進数23ケタ分+左端いつも1の1ケタ分で,トータル24ビット分の情報があるわけです。

 つぎは指数部です。指数部は2-3のようにマイナスの値になることもあります。しかし,指数部の符号を示すために1バイト消費してしまうと,-0乗と+0乗で同じ意味になってしまい,無駄が生じます。整数型のデータでは補数を利用してこの無駄を排除しますが,浮動小数点型データの指数部ではイクセス表現という方法を利用します。指数部が8ビット(10進数で0~255)なら,ちょうど真ん中の127を0乗と定めるのです。これでめでたく,-127乗から,128乗までの指数を8ビットで表せます。

 これらの工夫は細かいもので“セコい”と思うかもしれません。しかしそのおかげで,CPUの設計が楽になったり,一つのデータが8バイト(64ビット)で,演算が2倍以上遅くなる倍精度浮動小数点型データを使わなくて済む場合があったりします。面倒でもコンピュータの都合に合わせた分だけ価値があることがご理解いただけたでしょうか。ちなみに倍精度浮動小数点型データでは,一つの値を表す64ビットを,符号部1ビット,指数部11ビット,仮数部52ビットに分けて使います。