植物 植物
直前対策講座:浮動小数点表示

AOBA's Information Processing Education



1997/09/08

注意1:このページは、回線を切断した後でゆっくりご覧になってください(テキストを印刷する場合は、その取り扱いに注意してください)。

注意2:背景が白地の画面を長時間見つめていると頭が痛くなってしまいますので、ここは背景をグレーにしています。


「昭和61年 第1種 午前 問3」

問3 浮動小数点表示に関する次の記述中の(   )に入れるべき適当な字句を解答群の中から選べ。

 現在、多くの計算機で採用されている単精度の浮動小数点表示は、次のような形になっている。

(1) 実数xを次のように表す。

 x=a×16n ただし、16-1 ≦ | a | < 1.0

(2) このaとnを用いて、xを符号(s)、指数部(e)、仮数部(m)を計32ビットで表す。

図

 s:x≧0のとき0、x<0のとき1
 e:n+64の値を示す7ビットの正整数
 m:aの絶対値。仮数部の左端の△印が小数点の位置を表す。

 ただし、x=0のときは、32ビットすべてを0とする。
 例えば、100という数は

 100=6×161+4×160=162×(6×16-1+4×16-2

 となって

01000010011001000000000000000000

と表現される。

 今、π=3.1415926535・・・・・という数を考える。
これを16進数で表すと、

 π=3×160+2×16-1+4×16-2+3×16-3+15×16-4+6×16-5+10×16-6+8×16-7・・・・・・

となるので、πの浮動小数点表示は( a )のようになる。また、π/4 を浮動小数点表示すると( b )のようになる。ただし、丸め(四捨五入)は考えないものとする。

 更に、変数Aにπ/4 という値が入っているとき、B=A×4.0という命令を実行して変数Bにπの近似値を格納した後に、この格納された値を使ってC=B÷4.0という命令を実行するとCの値は浮動小数点表示で( c )のようになる。

解答群

00111111001100100100001111110110

01000000001100100100001111110110

01000001001100100100001111110110

01000000110010010000111111011000

01000000110010010000111111011010

01000001110010010000111111011010


解説

 100を基数が16の浮動小数点で表現した場合、
(0 1000010 0110 0100 0000 0000 0000 0000)2
になるのは分かりました?。
 これを詳しく解説します。

 まず、100を16進数に変換します。これは解説するまでもなく(64)16ですね。つまり、
 100=(64)16×160
です。

 次にこれを正規化します。正規化とは、仮数aを

 16-1 ≦ | a | < 1.0

 の範囲にすることを言います。仮数の(64)16は当然ながら正規化されていません(100だから)ので、正規化する必要があります。
 ここで、次のことが重要です。

その1:シフトの意味
 n進数を左に1桁シフトすることは、nを乗ずることと同じ。同じように、n進数を右に1桁シフトすることは、nで除すことと同じ。

その2:正規化された数の条件
 仮数が1未満でかつ、小数点以下1桁目が0以外ならば正規化されている

 仮数の(64)16を正規化された数の条件を満足するまで右シフトします。すると、
 100=(64)16×160=(0.64)16×162
となります。仮数部を162で除しましたので(2桁右シフトしましたので)、その代わりに162を乗じていることに注意してください。

 後は、符号(s)、指数部(e)、仮数部(m)にそれぞれ2進数で当てはめればOKです。

符号は正の数なので、(0)2
指数部は2なので、(0000010)2、ただしバイアス64だから(1000010)2
仮数部は(0.64)16なので、小数点以下は(0110 0100)2

 これを連結すれば、(0 1000010 0110 0100 0000 0000 0000 0000)2となります。なお、仮数部の後方の余った分については、すべて0を詰めなければなりません。

aについて

 16進数で考えた方が簡単かもしれません。

 π=3×160+2×16-1+4×16-2+3×16-3+15×16-4+6×16-5+10×16-6+8×16-7・・・・
  =(3.243F6A8・・・)16×160
  =(0.3243F6A8・・)16×161

符号は正の数なので、(0)2
指数部は1なので、(0000001)2、ただしバイアス64だから(1000001)2
仮数部は(0.3243F6A8)16なので、小数点以下は
(0011 0010 0100 0011 1111 0110 1010 1000)2
ただし、仮数部は24ビットなので、後方を切り捨てて、
(0011 0010 0100 0011 1111 0110)2

 これを連結すれば、(0 1000001 0011 0010 0100 0011 1111 0110)2となります。

bについて

 2進数を4で除すことは、この値を2桁右シフトすることと同じです。
 そこで、πの仮数である(0011 0010 0100 0011 1111 0110 1010 1000)2を2桁右シフトします。

(0011 0010 0100 0011 1111 0110 1010 1000)2 元のπの仮数 
(0000 1100 1001 0000 1111 1101 1010 1010 00)2 2桁右シフト

 これを16進数に変換します。
(0000 1100 1001 0000 1111 1101 1010 1010 00)2=(0C90FDAA?)16

つまり、
 π/4=(0.0C90FDAA?)16×161
です。

 この値の仮数部の少数点以下1桁目が0で正規化されていませんので、これを正規化します。

 π/4=(0.0C90FDAA?)16×161
    =(0.C90FDAA?)16×160

符号は正の数なので、(0)2
指数部は0なので、(0000000)2、ただしバイアス64だから(1000000)2
仮数部は(0.C90FDAA?)16なので、小数点以下は
(1100 1001 0000 1111 1101 1010 1010 00??)2
ただし、仮数部は24ビットなので、後方を切り捨てて、
(1100 1001 0000 1111 1101 1010)2

 これを連結すれば、(0 1000000 1100 1001 0000 1111 1101 1010)2となります。
(2進数を4桁左シフトすることは16を乗ずることと同じ、ということに気付けば、ここで行ったように、わざわざ16進数に変換してから再度2進数に変換する必要はありません)

cについて

変数A:(0 1000000 1100 1001 0000 1111 1101 1010)2
変数B:(0 1000001 0011 0010 0100 0011 1111 0110)2 (10)2失う
変数C:(0 1000000 1100 1001 0000 1111 1101 1000)2

 変数Bを計算する際、仮数部の24ビットで表現できない部分の2ビット(変数Aの最後尾の10の部分)が失われます。
 したがって、これを4で除して変数Cに代入した値は、変数Aの最後尾の2ビットをともに0とした値です。

 それにしても浮動小数点表示に関する問題は面倒ですね。


解答

a−ウ  b−オ  c−エ