次は0以上かつ1より小さい小数を 2 進数に基数変換する方法について説明します。
なお負の範囲(0より小さいかつ-1より大きい)にある小数は前ページと同様に2 の補数演算によって計算できます。

さて整数の場合は元の値を 2 で割っていましたが、小数の場合は以下の様に 2 をかけて演算していきます。

0 以上かつ 1 より小さい小数を 2 進数に変換

A を $ 0 \le \textrm{A} < 1$ の 10 進数の小数とする

  1. 有効桁数(精度とも言います) n ビットを決める ※ 1 以上にする
  2. A に 2 をかける。この時の積の整数部分を $r_{-1}$、積から $r_{-1}$ を引いた残りを $p_{-1}$ とする
  3. $p_{-1}$ に 2 をかける。この時の積の整数部分を $r_{-2}$、積から $r_{-2}$ を引いた残りを $p_{-2}$ とする
  4. $p_{-2}$ に 2 をかける。この時の積の整数部分を $r_{-3}$、積から $r_{-3}$ を引いた残りを $p_{-3}$ とする
  5. これを n+1 回繰り返す
  6. $r_{-1}$ を先頭に $r_{-(n+1)}$ まで順に並べる
  7. 0b を先頭に付ける ※ 2 進数を意味する接頭語
  8. この時点で n+1 ビットの 2 進数 0b $r_{-1}r_{-2}\cdots r_{-(n-1)}r_{-n}r_{-(n+1)}$ が得られる
  9. 最後のビット($r_{-(n+1)}$) が 0 だったら n+1 ビット目を切り捨てて先頭から n ビットの 2進数にする
  10. 最後のビット($r_{-(n+1)}$) が 1 だったら n+1 ビット目を切り上げて先頭から n ビットの 2進数にする
  11. n ビットの 2 進数 0b $r_{-1}r_{-2}\cdots r_{-(n-1)}r_{-n}$ が得られる

※ (9)(10)の処理のことを「最近接偶数丸め」と呼びます

次は逆に 2 進数を 0 以上かつ 1 より小さい小数に基数変換します。

2 進数を 0 以上かつ 1 より小さい小数に変換

n ビットの 2 進数が 0b $r_{-1}r_{-2}\cdots r_{-(n-1)}r_{-n}$ で与えられる時、

A = $r_{-1}\cdot2^{-1} + r_{-2}\cdot2^{-2} + \cdots + r_{-(n-1)}\cdot 2^{-(n-1)} + r_{-n}\cdot 2^{-n} $

と 10 進数が得られる

では例として A = 0.625 を有効桁数 n = 4 で 2 進数に変換してみましょう。

例: 0.625 を 2 進数に変換 (n = 4 )

A = 0.625 とする

  1. 有効桁数 を n = 4 ビットとする
  2. A に 2 をかけると 1.25 。積の整数部分は $r_{-1} = 1$、積から $r_{-1}$ を引いた残りは $p_{-1} = 0.25$
  3. $p_{-1} = 0.25 $ に 2 をかけると 0.5 。積の整数部分は $r_{-2} = 0$、積から $r_{-2}$ を引いた残りは $p_{-2} = 0.5$
  4. $p_{-2} = 0.5 $ に 2 をかけると 1 。積の整数部分は $r_{-3} = 1$、積から $r_{-3}$ を引いた残りは $p_{-3} = 0$
  5. $p_{-3} = 0 $ に 2 をかけると 0 。積の整数部分は $r_{-4} = 0$、積から $r_{-4}$ を引いた残りは $p_{-4} = 0$
  6. $p_{-4} = 0 $ に 2 をかけると 0 。積の整数部分は $r_{-5} = 0$、積から $r_{-5}$ を引いた残りは $p_{-5} = 0$
  7. n = 4+1 = 5 回繰り返したので計算終了
  8. $r_{-1}$ を先頭に $r_{-5}$ まで順に並べると 10100
  9. 0b を先頭に付けると 0b10100
  10. 最後のビット($r_{-5})$ が 0 なので最後のビットを切り捨てる
  11. n = 4 ビットの2進数 0b1010 が得られる

ちなみに A は 0.625 = 5/8 と、分母が 2、4、8、・・・の様に $2^x$ で表される分数に変換出来ます。
この場合は以下の様に分数を使って計算すると楽になります。

分数を使って計算するバージョン

A = 0.625 = 5/8 なので

  1. 有効桁数 を n = 4 ビットとする
  2. A に 2 をかけると 10/8 = 5/4 = 1+1/4 。積の整数部分は $r_{-1} = 1$、積から $r_{-1}$ を引いた残りは $p_{-1} = 1/4$
  3. $p_{-1} = 1/4 $ に 2 をかけると 1/2 。積の整数部分は $r_{-2} = 0$、積から $r_{-2}$ を引いた残りは $p_{-2} = 1/2$
  4. $p_{-2} = 1/2 $ に 2 をかけると 1 。積の整数部分は $r_{-3} = 1$、積から $r_{-3}$ を引いた残りは $p_{-3} = 0$
  5. $p_{-3} = 0 $ に 2 をかけると 0 。積の整数部分は $r_{-4} = 0$、積から $r_{-4}$ を引いた残りは $p_{-4} = 0$
  6. $p_{-4} = 0 $ に 2 をかけると 0 。積の整数部分は $r_{-5} = 0$、積から $r_{-5}$ を引いた残りは $p_{-5} = 0$
  7. n = 4 + 1 = 5 回繰り返したので計算終了
  8. 以下同じ

では逆に 0b1010 を小数に変換してみます。

例: 0b1010 を 0 以上かつ1より小さい小数に変換

A = $1\cdot 2^{-1} + 0\cdot 2^{-2} + 1\cdot 2^{-3} + 0\cdot 2^{-4}$

 =1・(1/2) + 0・(1/4) + 1・(1/8) + 0・(1/16)

 =1/2 + 0 + 1/8 + 0 = 5/8 = 0.625

ところで、A の値によっては有効桁数 n をいくら大きくしても最後の残り $p_{-(n+1)}$ が 0 にならない場合があります(というよりも、ほとんどの場合はそうなります)。

例えば A = 0.123、n = 4 の場合を考えてみましょう。

例: 0.123 を 2 進数に変換 (n = 4 )

A = 0.123 とする

  1. 有効桁数を n = 4 ビットとする
  2. A に 2 をかけると 0.246 。積の整数部分は $r_{-1} = 0$、積から $r_{-1}$ を引いた残りは $p_{-1} = 0.246$
  3. $p_{-1} = 0.246 $ に 2 をかけると 0.492 。積の整数部分は $r_{-2} = 0$、積から $r_{-2}$ を引いた残りは $p_{-2} = 0.492$
  4. $p_{-2} = 0.492 $ に 2 をかけると 0.984 。積の整数部分は $r_{-3} = 0$、積から $r_{-3}$ を引いた残りは $p_{-3} = 0.984$
  5. $p_{-3} = 0.984 $ に 2 をかけると 1.968 。積の整数部分は $r_{-4} = 1$、積から $r_{-4}$ を引いた残りは $p_{-4} = 0.968$
  6. $p_{-4} = 0.968 $ に 2 をかけると 1.936 。積の整数部分は $r_{-5} = 1$、積から $r_{-4}$ を引いた残りは $p_{-5} = 0.936$
  7. n = 4+1 = 5 回繰り返したので計算終了 ※ 最後の残り $p_{-5}$ が 0 で無いことに注目!
  8. $r_{-1}$ を先頭に $r_{-5}$ まで順に並べると 00011
  9. 0b を先頭に付けると0b00011
  10. 最後のビット($r_{-5}$) が 1 なので最後のビットを切り上げる( 0b0001 + 0b1 = 0b0010 )
  11. n = 4 ビットの2進数 0b0010 が得られる

今回は計算が途中で打ち切られてしまいました。
では 0b0010 を小数に変換してみましょう。

例: 0b0010 を0 以上かつ 1 より小さい小数に変換

A = $0\cdot 2^{-1} + 0\cdot 2^{-2} + 1\cdot 2^{-3} + 0\cdot 2^{-4}$

 =0・(1/2) + 0・(1/4) + 1・(1/8) + 0・(1/16)

 = 0 + 0 + 1/8 + 0 = 1/8 = 0.125

すると元の値(0.123)とは違う値(0.125)になってしまいました。

このように、小数を 2 進数化すると大抵の場合誤差が生じます。
この誤差のことを「丸め誤差」と呼び、以下の式により計算します。

丸め誤差の定義

丸め誤差 = 変換後の値 - 元の値

※ | 変換後の値 - 元の値 | という様に絶対値を取る定義もあります

上の例の場合、丸め誤差 = 0.125 - 0.123 = 0.002 となります。