• ベストアンサー

浮動小数点数

再質問で畏れ入ります。 数値を32ビット浮動小数点形式で表す。指数部は2を基数とし、負数は2の補数で表現する。10進数0.375をこの2を基数とした浮動小数点形式で正規化したものはどれか。ただし結果は16進数で表現する。 答え:7FC00000 という問題です。 まず0.375を2進数に 0.011 正規化 0.11 * 2^-1 指数部-1を2進数で求める -0000 0001 ->1111 1111 仮数部符号は正の数なので0 0111 1111 ???? ???? ???? ???? ???? ???? と・・・ ここの部分からわかりません・・・ (なぜか手持ちの参考書には省略してあり・・・) 7Fの部分はこれで間違いないでしょうか? またそのあとのC00000 はどうやって導くのか教えてください。 お願いいたします

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

まず、0.375を2進表現すると 0.011 になります。 言いかえれば、 0.011 * 2の0乗 です。 この値は 0.11 * 2の-1乗 に等しくなります。 ここで、浮動小数点の形式を「符号1ビット、指数7ビット、仮数24ビット」と仮定すると、 符号:正の数なので 0 指数:2の-1乗。-1の2の補数 1111111 仮数:0.11の「0.」を取り除き、下位ビットに0を埋め 110000000000000000000000 このようになります。これを並べると 0 1111111 110000000000000000000000 となり、16進数表現で 7FC00000 となります。 これを 0.011 * 2の0乗 のまま正規化せずに浮動小数点形式にしてしまうと 符号:正の数なので 0 指数:2の0乗。0は 0000000 仮数:0.011の「0.」を取り除き、下位ビットに0を埋め 011000000000000000000000 このようになります。これを並べると 0 0000000 011000000000000000000000 となってしまいますが、仮数部の上位に0がある分だけ仮数部の下位の桁が減り、精度が落ちてしまいます。 そこで、仮数部を2倍し(つまり上位の0を取り除いて左に1ビットシフトし)、仮数部を2倍した代わりに指数部を1つ減らします。 つまり「0.375×1(0.375×2の0乗)では無駄があるので、0.75×0.5(0.75×2の-1乗)にしよう」と、正規化を行うのです。 なお、浮動小数点形式を規定したIEEE754では、上記の形式と異なる形式を用いる事により、更に1ビット分精度を上げています。仮数部を正規化する事により仮数部の最上位ビットが常に1になる事を利用し、その最上位の1を取り除いて仮数部の桁を増やしています。

azicyan
質問者

お礼

>仮数部の上位に0がある分だけ仮数部の下位の桁が減り、精度が落ちてしまいます。 ありがとうございます。 正規化の意味合いまで教えていただいて、とても勉強になりました。意味までわかっていたほうが覚えやすいですね! >仮数:0.11の「0.」を取り除き、下位ビットに0を埋め 110000000000000000000000 このようになります。これを並べると 0 1111111 110000000000000000000000 とてもご丁寧にありがたいです。 実は購入した参考書が 突然 「C00000」 となってしまっていて、1100だからCとは書いていないのです。 このCは何処からきたんだ・・・と頭を抱えておりました。 仮数部は0.11だから0011では・・・と思い込み どんどんわからなくなっていました。 とても助かりました ありがとうございました!!

その他の回答 (1)

  • HOGERA3
  • ベストアンサー率35% (50/139)
回答No.1

7Fまではazicyaさんの方法で間違いありません。 仮数部の求め方ですが、単に正規化したものの 小数点以下をそのまま上位ビットから並べて、 余ったところは0で埋めるだけです。 この問題の場合は、正規化すると 0.11 * 2^(-1) ですから、0.11の11を上位ビットにおいて、 残りは全部0になります。 つまり、質問の ???? ???? ???? ???? ???? ???? は 1100 0000 0000 0000 0000 0000 になるわけです。

azicyan
質問者

お礼

>0.11の11を上位ビットにおいて わかりました!! すっきりいたしました。 どうもこの部分の説明がちゃんと書いていなくて 混乱してしまいました! ありがとうございました!