- ベストアンサー
情報科学について!進数変換の問題です。
(0.01)10を全体が2バイトで基数は8、仮数部は12bits、指数部は3bitsでかさあげ表現の浮動小数点表示を用いて2進数表示すると( )2となる。 という問題で答えが0010101000111101なのですがどうしてそうなるのかわかりませ。 詳しく解説してもらえないでしょうか? よろしくお願いします!
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>(0.01)10を全体が2バイトで基数は8、仮数部は12bits、指数部は3bitsでかさあげ表現の浮動小数点表示を用いて2進数表示すると( )2となる。 2バイト(16ビット)の構成は 「全体の符号1ビット(正0/負1)+指数部3ビット(基数8)+仮数部12ビット」 のようです。 >答えが0010101000111101なのですがどうしてそうなるのかわかりませ。 >詳しく解説してもらえないでしょうか? 上の構成では 先頭の1ビット目=0で正の数(+) 2~4ビット目の3ビット=指数部(010)2(かさ上げ表現:エクセス4コード) ⇒2-4=-2⇒指数部:8^(-2)=1/64 5~16ビット目の12ビット(仮数部)=(0.101000111101)2=0.639892578125 となるので 不動小数点数を10進数に直すと +0.639892578125*(1/64)=0.009998321533203125≒0.01 (二進化するとき2進12ビットを超える桁は切り捨てる(2進化によるビット落ち)ので元の数値との誤差がでます。) と確かに確認できます。 実際に(0.01)10を「符号ビット+指数部が基数8の3ビットのエクセス4方式、仮数部12ビット」で浮動小数点表示に変換したい場合は次のように求めます。 まず、(0.01)10が正の数なので符号ビット=0 (0.01)10から指数部と仮数部を求める 絶対値が1未満の数値の場合、8倍することを繰り返して行って (0.5)以上、1未満になるような8のべき乗数nを求める。 (0.01)10*8=(0.08)10(n=1) (0.08)10*8=(0.64)10(n=2) …これでOK 仮数部は(0.64)10 指数部は8^(-n)=8^(-2) 1未満の仮数部は、小数以下を2倍する事を繰り返し整数部への繰上げを並べて2進数に変換する。 (0.64)10 *2=(1.28)10→ 整数部1→ (0.1)2 (0.28)10 *2=(0.56)10→ 整数部0→ (0.10)2 (0.56)10 *2=(1.12)10→ 整数部1→ (0.101)2 (0.12)10 *2=(0.24)10→ 整数部0→ (0.1010)^2 (0.24)10 *2=(0.48)10→ 整数部0→ (0.10100)^2 (0.48)10 *2=(0.96)10→ 整数部0→ (0.101000)^2 (0.96)10 *2=(1.92)10→ 整数部1→ (0.1010001)2 …… ← 2進数の小数以下のビット数(桁数)が12になるまで繰り返す。 … → (0.101000111101)2 この小数以下の「101000111101」が浮動小数点表示の5~16ビット目になります。 次に指数部の8^(-2)は 基数が8、べき乗指数(-2)は、(かさ上げ表現:エクセス4コード)なので4=(100)2だけかさ上げして(加えて) (-2)+4=2=(010)2 この「010」が「かさ上げ表現:エクセス4コード」による指数部として浮動小数点表示の 指数部の2~4ビット目になります。 これで1~16ビット目まで全部決まりましたね。 1ビット目:0 2~4ビット目:010 5~15ビット目:101000111101 これをつなげれば浮動小数点表示になります。 お分かりになりましたか? ^2)*8^(-2)