10進小数を 2進・8進・16進の小数に変換する手順。整数部分の「割り算法」と対をなす「掛け算法」を使い、基数を変えても同じパターンで解けます。
小数部の基数変換は、10進小数(0.625 など)を別の基数の小数(2進数なら 0.101 など)に直す操作です。整数部分の「割り算法」とは違って、「掛け算法」を使います。
例:
・0.625(10) = 0.101(2)
・0.5(10) = 0.4(8)
・0.25(10) = 0.4(16)
ただし10進では割り切れる小数でも、他の基数では循環小数になることがあります。例えば0.1(10)を2進数にすると 0.0001100110011... という循環小数になります。これがコンピュータでの「浮動小数点誤差」の根本原因です。
手順は4ステップを繰り返すだけ。
・① 小数部に変換先の基数を掛ける
・② 結果の整数部を取り出す(それが結果の桁)
・③ 残った小数部を「次の入力」として、また①②
・④ 小数部が 0 になるか、必要な精度に達するまで繰り返す
0.625 を2進数に変換する例:
・0.625 × 2 = 1.25 → 整数部 1、残り 0.25
・0.25 × 2 = 0.5 → 整数部 0、残り 0.5
・0.5 × 2 = 1.0 → 整数部 1、残り 0(終了)
・結果を上から並べる: 0.101(2)
整数部の割り算法との対比:
・整数部: 「2で割って余りを集めて逆順に並べる」
・小数部: 「2を掛けて整数部を集めて上から順に並べる」
方向が「下からの逆順」ではなく「上から順」になる点に注意。
10進では綺麗な値でも、2進ではキレイに割り切れず循環小数になる小数があります。これがコンピュータの「浮動小数点誤差」の正体です。
有名な例: 0.1(10) を2進数に変換
・0.1 × 2 = 0.2 → 0、残り 0.2
・0.2 × 2 = 0.4 → 0、残り 0.4
・0.4 × 2 = 0.8 → 0、残り 0.8
・0.8 × 2 = 1.6 → 1、残り 0.6
・0.6 × 2 = 1.2 → 1、残り 0.2 ← 2 行目と同じ!
・以後 0.2 → 0.4 → 0.8 → 0.6 → 0.2 ... を無限に繰り返す
結果: 0.0001100110011... (0011 が永遠に繰り返される循環小数)
この循環小数を浮動小数点(IEEE 754)が有限ビット数で打ち切るため、0.1 + 0.2 ≠ 0.3 となるのがプログラミングの「あるある」です。これはつまり「浮動小数点では正確に表せない小数がある」ということです。
上のツールで「0.1」を選び、2進数を試してみてください。10ステップ目でも 0 に収束せず、循環小数になっていることが見えます。逆に「0.625」「0.5」「0.25」のような「2のべき乗の和で表せる小数」は、ぴったり割り切れます。