先ほどは10進数の正規化について学びました。
次は2進数の正規化と浮動小数点表現について学びましょう。
それでは、2進数の浮動小数点表現について学びます。
IEEE754(アイトリプルイー754)と呼ばれる国際規格にのっとって説明します。
IEEE?国際規格?
コンピュータによって表現方法が違うと面倒なので、世界的に表現方法を統一したんです。
それを国際規格といい、それを定めたのが、米国電子団体のIEEEです。
IEEEはたくさんの国際規格を定めていて、その規格すべてに番号を割り振っています。
浮動小数点表現は754番目の規格ということですね。
それでは、IEEE794について学んでいきましょう。
正規化の方法
IEEE754では、2進数を以下の形に正規化します。
S:符号部
符号部は、その数値の正負(+か-)を表現します。
Sは0か1で表現し、0なら+、1なら-となります。
・ S=0の時 → (-1)0 = +1
・ S=1の時 → (-1)1 = -1
M:仮数部
IEEE 754では、正規化の時に仮数部を「1.M」という形に変換されます。
0以外の数値は必ず「1」が存在するため、1番左の1のみを整数部分(小数点の左側)へ来るように、小数点を移動します。
実際に記録するのは小数以下の部分なので、整数部分を0にするときよりも、1ビット分減らすことができます。
例えば、正規化後の仮数部分が「1.01001」となった場合は、M = 01001 となります。
E:指数部
指数部は、10進数と同様に小数点がいくつ動くかを表現します。
ここでは、実際に動く数に、127を加算した値を指数部として記録します。
実際に計算するときは、指数部の値から127を引いた値だけ、小数点を動かします。
例:E = 130 のとき → 130 − 127 = +3
例:E = 124 のとき → 124 − 127 = −3
なんで指数は127を足した値にするんですか?
指数は、-127〜128の値が表現できますが、これに127を加算することで、0~255の範囲になります。
負の値も正の値に変わることで、2の補数などの符号変換を意識する必要がなくなるんです。
なるほど、色々考えて工夫されているんだね!
2進数での表現方法
IEEE754では、正規化した数値を32ビットで表現します。
ビットごとの内訳は以下の通りです。
S:符号部 1ビット
正の値の時は0を、負の値のときは1を格納します。
E:指数部 8ビット
指数に127を加算した値を、2進数8桁で格納します。
8桁に満たない場合は、左に0を入れて、8桁で表現します。
例:指数が -100 のとき
-100 + 127 = 27
27 →2進数に変換→ 11011
8桁で表現 → 00011011
M:仮数部 23ビット
正規化後の「1.M」のMの部分を、左詰めで格納します。
例:仮数が 1.0101 のとき
M = 01010000000000000000000
そうなんです。負の値を記録するときは、一回「ー(マイナス)」を取って正の値で仮数と指数を求めて、
符号(S)を1にするだけでいいんですよ。
例えば、200と-200の違いは、符号(S)が0か1かの違いだけなんです。
実際の数値を当てはめてやってみたいな。
それでは、試してみましょう。
2進数での表現方法の変換手順
10進数の200を、浮動小数点表現にしよう。
-
手順1
200を2進数に変換します。
(200)10 → (11001000)2
基数変換の方法を忘れた場合は、以前に学んだ「基数変換」の回で学び直しましょう。
-
手順2
求めた2進数の値を、IEEE754の形式に従い正規化します。
(11001000)2
↓↓整数部分が1つだけ残るように小数点を7つシフト↓(1.1001000)2 × 27
↓↓0は省略↓(1.1001)2 × 27
↓↓符号を判別するため(-1)を追加する。その上で200は正の数なので0乗する。↓(-1)0 × (1.1001)2 × 27
※0乗するとどんな数も1になる もし1乗した場合は-1がそのまま使われる。
-
手順3
各数値を確認します。
S・符号部:0
E・指数部:7 + 127 = 134
M・仮数部:1001
指数は127を足すこと、仮数は先頭の1は取り除くことを忘れずに!!
-
手順4
32ビットの表現に当てはめていきます。
S・符号部 = 0
-
手順5
E・指数部 = 134
134を2進数に変換すると、「10000110」となる。
-
手順6
M・仮数部 = 1001
右に0を埋めて、23ビットにする。
浮動小数点表現を10進数に変換する手順
浮動小数点表現の16進数の「C2300000」を10進数に変換しよう。
急に16進数が出てきたぞ?
32ビットの数値を並べると視覚的に辛いので、そのまま4ビットずつ区切って16進数に変換して表記することもあるんです。
では、まず2進数に変換すればいいんですね。やってみます!!
-
手順1
16進数の「C2300000」を2進数に変換する。
(C2300000)16 → (110000100011000・・・)2
16進数で表記されている場合は、2進数に変換した数値をそのまま32bitに当てはめてください。
この時に、符号部、指数部、仮数部を意識する必要はありません。
-
手順2
各値を変換し、計算します。
S・符号部:1
E・指数部:(10000100)2→(132)10
M・仮数部:01100・・・ → 1.011
仮数部の頭に「1.」をつけてください。右に並んだ0は全て省略できます。
(-1)1 × 1.011 × 2132-127
=(-1)1 × 1.011 × 25
= -101100
指数は、127を引くことを忘れずに!!
-
手順3
10進数に変換します。
-101100 = -42
|
IEEE754 |
米国電子学会のIEEE(アイトリプルイー)が定めた、浮動小数点表現の国際規格 |
次のスライドで、変換の練習問題を出しますよ。