ここでは 10 進数の実数を「浮動小数点数」形式の 2 進数に変換する方法について学びます。

浮動小数点数は固定小数点数と違って小数点の位置が固定されていないという形式です。
なお浮動小数点数を実現する方法はいくつかありますが、今回はもっともポピュラーな「IEEE754」を用いる方法について学びます。

さて IEEE754 では小数を次のようにして表しています。

浮動小数点数(IEEE754)

符号部 + 指数部 + 仮数部

符号部」は符号を表す部分です。
長さは 1 ビットで、0 のとき+、1 の時はマイナスを表します。

指数部」は小数点の位置を表す部分です。

仮数部」は有効数字を表す部分です。

なお IEEE 754 では代表的な形式の全体や各部の長さ(ビット数)は以下の表1の様に決められています。

表 1 : IEEE754 基本形式

形式 全体 符号部 指数部 仮数部
半精度 16 ビット 1 ビット 5 ビット 10 ビット
単精度(float) 32 ビット 1 ビット 8 ビット 23 ビット
倍精度(double) 64 ビット 1 ビット 11 ビット 52 ビット
倍々精度/4倍精度 128 ビット 1 ビット 15 ビット 112 ビット

では 10 進数の実数を浮動小数点数形式に変換してみます。

10 進数の実数を浮動小数点数(IEEE754)形式の 2 進数に変換

A を 10 進数の実数とする

  1. 「符号部」を求める。元の値が 0 以上なら 0、 マイナスの値なら 1
  2. Aの絶対値 |A| を固定小数点数形式の2進数に変換する(小数以下の有効桁数は十分に大きく取る)
  3. 小数点を左右に移動して整数部を 0b1 の 1 桁のみにする(※ 先頭に0が入っている場合は取り除く)。小数点を移動した回数を E とする(右方向がマイナス、左方向がプラス)
  4. 「指数部」を求める。(3)で求めた E に $2^{(指数部の長さ-1)}-1$ (※下の補足参照)を足して 2 進数に変換する。表1で示した長さ(ビット数)になるように先頭を0で埋める
  5. 「仮数部」を求める。(3)で求めた 2 進数の先頭から "0b1." を取り除いた部分を M とする。もしMが表1で示した長さ(ビット数)よりも大きい場合は末尾を丸める。逆にMの方が短い場合は末尾を0で埋める
  6. 符号部、指数部、仮数部の順につなげて 0b を先頭に付ける

※ 補足

半精度の場合 → $2^{5-1}-1 = 15$ を E に足す
単精度の場合 → $2^{8-1}-1 = 127$ を E に足す
倍精度の場合 → $2^{11-1}-1 = 1023$ を E に足す
倍々精度の場合 → $2^{15-1}-1 = 16383$ を E に足す

逆にこの浮動小数点数形式で表された2進数を10進数に変換する方法は次の通りです

浮動小数点数(IEEE754)を10進数に変換

 

  1. 指数部の2進数を10進数の整数に変換して E に代入
  2. E から $2^{(指数部の長さ-1)}-1$ を引く (※ 下の補足参照)
  3. 仮数部の先頭に「0b1.」を追加して固定小数点数変換する
  4. (3)で求めた固定小数点数の小数点の位置を E だけ移動する (右方向がプラス、左方向がマイナス)
  5. (5)で求めた固定小数点数を10進数に戻す
  6. 符号部が 1 ならマイナスを付ける

※ 補足

半精度の場合 → $2^{5-1}-1 = 15$ を E から引く
単精度の場合 → $2^{8-1}-1 = 127$ を E から引く
倍精度の場合 → $2^{11-1}-1 = 1023$ を E から引く
倍々精度の場合 → $2^{15-1}-1 = 16383$ を E から引く

では例として 10 進数 A = -12.625 を単精度浮動小数点数に変換してみます。

例: -12.625 を単精度(32ビット)浮動小数点数に変換

A = -12.625 とする。

  1. 「符号部」を求める。A はマイナス値なので 符号部は 1
  2. A の絶対値 |-12.625| = 12.625 を固定小数点数形式の 2 進数に変換(整数部の桁数 4 ビット、小数部の有効桁数 4 ビット)すると 0b1100.1010
  3. 小数点を「左に 3 回」移動して整数部を 0b1 の 1 桁だけにすると 0b1.1001010
    左(プラス方向)に 3 回移動したので E = 3
  4. 「指数部」を求める。単精度なので E に 127 を足した E = 130 を 2 進数に変換して 10000010
    なお今回は表1で示した指数部のビット数と比べると同じビット数(8ビット)なので先頭を0で埋めなくても良い
  5. 「仮数部」を求める。(3)で求めた値の先頭から "0b1." を取り除いて M = 1001010
    表1で示したビット数(23ビット) よりも M の方が短い(7ビット)ので、末尾を16個の 0で埋めて M = 10010100000000000000000
  6. 符号部、指数部、仮数部の順につなげて 0b を先頭に付けると -12.625 の単精度浮動小数点数は

    0b_1_10000010_10010100000000000000000

    (注) 見やすいように各部の間にアンダーバーを入れてますが、実際にはアンダーバーは入りません

逆に単精度浮動小数点数 0b11000001010010100000000000000000 を 10 進数の実数に変換してみます。

例: 単精度浮動小数点数 0b11000001010010100000000000000000 を 10 進数の実数に変換

0b 1_10000010_10010100000000000000000 の
符号部 = 1
指数部 = 10000010
仮数部 = 10010100000000000000000

なので

  1. 指数部の2進数を 10 進数の整数に変換すると E = 130
  2. 単精度なので、E から 127 を引いて E = 3
  3. 仮数部の先頭に「0b1.」を追加して固定小数点数に変換すると 0b1.1001010 ※ 見づらいので末尾の 16 個の 0 は省略
  4. (3)で求めた固定小数点数の小数点の位置を E = 3 回(プラスなので右に)移動すると 0b1100.1010
  5. (4)で求めた固定小数点数を10進数に戻すと 12.625
  6. 符号部が 1 なのでマイナスを付けて -12.625