18.3.2 浮動小数点表現

整数の次は,小数の符号化を考えましょう.

整数と違って,小数は簡単に符号化できません.というのも 10 進小数を 2 進小数で表そうとすると,ほとんどの場合は無限に続く循環小数になってしまうからです.たとえば 0.1(10) = 0.0001100110011…(2)です.0.1(10) ですら有限桁の 2 進小数で表せないのですから,一般の 10 進小数が有限桁の 2 進小数で表せる見込みはほとんどありません.そしてコンピュータでは無限を扱えないですから,10 進小数を近似的に扱うための方法を考えないといけないのです.そこで小数点以下の数値を表現する場合には,浮動小数点表現または実数表現と呼ばれる符号化が用いられます.

浮動小数点表現の基本的な考え方は指数表現の応用にあります.たとえば,物理や化学で用いられる Avogadro 定数は 6.02214129 × 1023 [mol-1] と定義されています.この 6.02214129 の部分を仮数,23 の部分を指数と呼ぶことにします.浮動小数点表現は仮数,指数,符号の 3 種類をそれぞれビット列で表現することによって 1 つの数を表す方法です.

浮動小数点表現の書き方として最も広く用いられているのは, IEEE (The Institute of Electrtical and Electronics Engineers) という団体の定めた IEEE 754 という規格です.IEEE 754 では,32 ビットで表現する単精度 (binary32) と 64 ビットで表現する倍精度 (binary64) が規定されています.以下,詳しく IEEE 754 による数値の表現方法を見ていきましょう.

まず単精度なら 32 ビット(第 0 ~ 31 ビット), 倍精度なら 64 ビット(第 0 ~ 63 ビット) を次のようにして符号,指数と仮数に割り当てます.

符号部 指数部 仮数部
単精度(32 ビット) 第 0 ビット(計 1 ビット) 第 1 ~ 8 ビット(計 8 ビット) 第 9 ~ 31 ビット(計 23 ビット)
倍精度(64 ビット) 第 0 ビット(計 1 ビット) 第 1 ~ 11 ビット(計 11 ビット) 第 12 ~ 63 ビット(計 52 ビット)
caution情報科学の分野では,しばしば番号を数えるとき,先頭を「1 番目」ではなく「0 番目」として数えることがあります.

そして符号部,指数部,仮数部によって次の数値を表します.

(-1)符号部×(1.仮数部)(2)×2(指数部-bias)

すなわち,数を

  • 正負の符号
  • 位取りをどれくらい動かすか
  • 上位の方の桁の,近似的な 2 進表記

という 3 つの組合せで表すのです.ここで bias は指数を負にする,すなわち小数点以下の数を表現するためのものです.単精度での場合 127,倍精度の場合 1023 という値になっています.これによって一番上の位を,単精度なら 2-127 から 2128 まで,倍精度なら 2-1023 から 21024 まで動かせるようにしています.この方法による数の表示は近似的にはなりますが,単に小数が扱えるだけでなく,通常の整数の符号化では扱えないような絶対値の大きな数値も計算できるというメリットがあります.

なお IEEE 754 では,指数部のビットがすべて 0 か 1 の場合,そのビット列は普通の数ではなく特殊な意味を持ちます.その意味は次節 hwb18.3.3 浮動小数点表現の精度・範囲と特別な値 で説明します.

例として 6.02214129×1023 という数を単精度浮動小数点表現にしてみます.

6.02214129×1023 = (-1)0×1.9925593×278

なので,符号部は 0,指数部は 78 + 127 = 205 = 11001101(2) です.また仮数部は 1.9925593 = 1.11111110000110000101111(2) となります.これらのビット列を繋げて,6.02214129×1023 の浮動小数点表現は

01100110 11111111 00001100 00101111

となります(見易くするため 8 ビットごとに空白で区切りました).

tipsIEEE 754 では,他にも 128 ビットで表現する四倍精度(binary128,仮数部 112 ビット,指数部 15 ビット)や,10 進数で表現する方法が規定されています.また,環境によっては,80 ビットを使った表現が利用できることもあります.しかしこれらは一般的ではないので,本ページでは省略します.
caution余談ですが,SI 単位系は定期的に改訂されています.この文書中での Avogadro 定数 6.02214129×1023 [mol-1] は,国際度量衡委員会の中にある単位諮問委員会が 2013 年に発表した externalSI 単位系第 9 版のドラフト文書 で勧告されている値を用いました.現在の理科年表に載っている値とは異なる可能性があります.