次は0以上かつ1より小さい小数を 2 進数に基数変換する方法について説明します。
なお負の範囲(0より小さいかつ-1より大きい)にある小数は前ページと同様に2 の補数演算によって計算できます。
さて整数の場合は元の値を 2 で割っていましたが、小数の場合は以下の様に 2 をかけて演算していきます。
A を $ 0 \le \textrm{A} < 1$ の 10 進数の小数とする
※ (9)(10)の処理のことを「最近接偶数丸め」と呼びます
次は逆に 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 進数に変換してみましょう。
A = 0.625 とする
ちなみに A は 0.625 = 5/8 と、分母が 2、4、8、・・・の様に $2^x$ で表される分数に変換出来ます。
この場合は以下の様に分数を使って計算すると楽になります。
A = 0.625 = 5/8 なので
では逆に 0b1010 を小数に変換してみます。
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 の場合を考えてみましょう。
A = 0.123 とする
今回は計算が途中で打ち切られてしまいました。
では 0b0010 を小数に変換してみましょう。
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 となります。