アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下の問題が分かりません。

8ビット浮動小数点数が、最上位ビットから順に符号1ビット、指数部3ビット、仮数部4ビットで構成されるとしたとき、10進数 0.1 を以下に示す過程で浮動小数点数化した。空欄を適当な数値でうめなさい。なお、仮数部の最上位ビットは1になるように指数部を調整するものとし、指数部は2の補数表記を用いるものとする。また無限小数については小数点以下10桁め以降は「...」で省して表記すること。
10進数 0.1を2進数にすると(ア)(2)となる。これを小数点以下最上位桁が1になるように変形すると(イ)(2) X 2^nとなる。nを3ビットの2進数で表すと(ウ)(2)である。よって浮動小数点数では(エ) (2)のように表現できる。この値は元の0.1よりも1/(オ)小さくなる。

(ア)0.0001100110...
(イ)1.1001100110...
(ウ)100
(エ)01001001
(オ)

途中までといてみたのですが(オ)が分かりません
詳しい方教えてください

A 回答 (4件)

No.2 です。


問題文をまじめに読んでいなくて、#2 では勝手に「IEEE のケチ表現」(仮数部を「1.****~」と表して、整数部の「1」を省略する)と解釈して処理しました。
(質問者さんもそうしたようですね)

問題文の(イ)は「これを小数点以下最上位桁が1になるように変形すると」とあるので、「IEEE のケチ表現」とは違うようです。

それでやると

0.1[10] = 1 × 10^(-1)
     = 0 × (1/2) + 0 × (1/4) + 0 × (1/8) + 1 × (1/16) + 1 × (1/32) + ・・・
     = 0.00011(0011)[2]
(0011) は以降無限繰り返しということ。

よって、10桁まで表記すれば
   = 0.00011 0011 0...    ←ア

仮数部の小数点以下最上位桁が1になるように変形すると ←※ここを訂正
  0.1100 1100 11... × 2^(-3)    ←イ    ←※ここを訂正

※※※※※ ↓これに伴って、以下すべてが訂正となります。

従って、指数部は
 -3[10] = -011[2]
これを「負数を2の補数で表わす3ビット」で表記すると
・「011」の「0」と「1」を逆転させて → 100
・1 を加えて
  100[2] + 001[2] = 101[2]   ←ウ

以上から、0.1[10] の対応する浮動小数点の2進数は、
  01011100[2]      ←エ

この「エ」の値を再び「10進数」に戻せば
 0.1100[2] × 2^(-3)
= 0.0001100[2]
= 1 × (1/16) + 1 × (1/32) + 0 × (1/64) + 0 × (1/128)
= (16 + 8)/256
= 24/256

元の10進数は 0.1[10] = 25.6/256 なので、その差は
 25.6/256 - 24/256 = 1.6/256 = 1/160    ←オ


問題文のやり方だと、「IEEE のケチ表現」に対して、仮数部の1ビット分だけ精度を損しますね。
それは「ビット落ち」のある「桁数の決まった数値処理」では大きな「欠陥」になりますね。
    • good
    • 1

10進数


0.1
を2進数にすると

(ア)0.0001100110…
………………………_(2)となる
これを小数点以下最上位桁が1になるように変形すると

(イ)0.11001100110…
………………………_(2)×2^nとなる
nを3ビットの2進数で表すと
(ウ)101_(2)
である
よって浮動小数点数では
(エ)01011100_(2)
のように表現できる
この値は元の
0.1
よりも
1
/
(エ)160
小さくなる
    • good
    • 0

まずは、基本事項として「n 進数の abcde.fg」とは



 a × n^4 + b × n^3 + c × n^2 + d × n^1 + e × n^0 + f × n^(-1) + g × n^(-2)

ということです。

一方、10進数で 0.1 を2進数で表わすには

① 0.1 × 2 = 0.2 繰上りなし
② 0.2 × 2 = 0.4 繰上りなし
③ 0.4 × 2 = 0.8 繰上りなし
④ 0.8 × 2 = 1.6 繰上りあり。残り 0.6
⑤ 0.6 × 2 = 1.2 繰上りあり。残り 0.2
これ以降②~⑤を繰り返し。

従って、「n進数」を [n] で書くとして

 0.1[10] = 1 × 10^(-1)
     = 0 × (1/2) + 0 × (1/4) + 0 × (1/8) + 1 × (1/16) + 1 × (1/32) + ・・・
     = 0.00011(0011)[2]
(0011) は以降無限繰り返しということ。

よって、10桁まで表記すれば
   = 0.00011 0011 0...    ←ア

仮数部の最上位ビットが「1」になるようにすると
  1.100 1100 110... × 2^(-4)    ←イ

従って、指数部は
 -4[10] = -100[2]
これを「負数を2の補数で表わす3ビット」で表記すると
・「100」の「0」と「1」を逆転させて → 011
・1 を加えて
  011[2] + 001[2] = 100[2]   ←ウ

以上から、0.1[10] の対応する浮動小数点の2進数は、仮数部は「イ」の整数部を除いて
  01001001[2]      ←エ

この「エ」の値を再び「10進数」に戻せば
 1.1001[2] × 2^(-4)
= 0.00011001[2]
= 1 × (1/16) + 1 × (1/32) + 0 × (1/64) + 0 × (1/128) + 1 × (1/256)
= (16 + 8 + 1)/256
= 25/256

元の10進数は 0.1[10] = 25.6/256 なので、その差は
 25.6/256 - 25/256 = 0.6/256 = 1/426.666・・・ ≒ 1/427    ←オ
    • good
    • 0

自分で確認してないので質問から判断すると仮数部は1.1001


1+1/2+1/16=25/16
0.1-25/16/16
=1/10-25/256
=3/1280
≒1/427
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!