10進数をIEEE 754 Float32へ変換する方法|13.25の計算例
この記事の要点
- 整数部と小数部を2進数へ変換し、1.x × 2ⁿの形へ正規化します。
- 指数nへbias 127を加え、8ビットの指数部を作ります。
- 符号・指数・23ビットの仮数を連結し、4ビットずつHEXへ変換します。
10進数からFloat32へ変換する全体手順
- 符号ビットを決めます。
- 整数部と小数部を2進数へ変換します。
1.x × 2ⁿの形へ正規化します。- 指数nにbias 127を加えて指数部を作ります。
- 先頭の1を除いた小数部分を23ビットの仮数部にします。
- 32ビットを4ビットずつ区切ってHEXへ変換します。
13.25を2進数へ変換する
整数部13は1101、小数部0.25は0.01です。したがって13.25は次の2進数になります。
13.25₁₀ = 1101.01₂小数部は、0.25×2=0.5、0.5×2=1.0の順に整数部分を並べると.01になります。
正規化して指数を求める
1101.01の小数点を左へ3桁移動し、先頭が1になる形にします。
1101.01₂ = 1.10101₂ × 2³実際の指数は3です。Float32のbias 127を加えると130になり、2進数では10000010です。
符号・指数・仮数を作る
0正の値
100000103 + 127
10101000000000000000000先頭の1を除く
正規化した1.10101の先頭の1は保存しません。残りの10101の右側を0で埋め、23ビットにします。
32ビット列をHEXへ変換する
0100 0001 0101 0100 0000 0000 0000 00004 1 5 4 0 0 0 013.25のFloat32表現
2進数:0 10000010 10101000000000000000000
HEX:41540000
負の数では符号ビットだけ変わるのか
値の絶対値が同じであれば、正規化した指数と仮数は同じで、符号ビットが1になります。たとえば−2.5のFloat32はC0200000です。
有限ビットに収まらない小数
0.1のように2進数で循環する小数は、23ビットの仮数部へ収まるよう丸められます。そのため、保存された値は入力した10進小数と完全には一致しません。
注意
手計算では末尾を単純に切り捨てず、実際には規定の丸め方法が適用されます。正確な最終ビットは変換ツールで確認してください。
よくある質問
13.25のFloat32 HEXは何ですか?
Big Endianで41540000です。ビット列は0 10000010 10101000000000000000000です。
Float32の指数に127を加えるのはなぜですか?
負の指数も符号なしの8ビットで保存できるよう、bias 127を加えた値を指数部へ格納するためです。
仮数部の先頭の1を保存しないのはなぜですか?
正規化数では先頭が必ず1になるため、省略しても復元できます。省略した分だけ有効数字を1ビット増やせます。
小数部を2進数へ変換する方法は?
小数部へ2を掛け、結果の整数部分を上から順に並べます。小数部が0になるか、必要な精度へ達するまで繰り返します。