2進数での浮動小数点数

学習の目的

  • 2進数での浮動小数点表現を理解する

コンピュータでは、浮動小数点表現も2進数で記録しています。

2進数での浮動小数点表現について学びましょう。

2進数の浮動小数点表現

先ほどは10進数の正規化について学びました。

次は2進数の正規化と浮動小数点表現について学びましょう。

それでは、2進数の浮動小数点表現について学びます。

IEEE754(アイトリプルイー754)と呼ばれる国際規格にのっとって説明します。

IEEE?国際規格?

コンピュータによって表現方法が違うと面倒なので、世界的に表現方法を統一したんです。

それを国際規格といい、それを定めたのが、米国電子団体のIEEEです。

IEEEはアイトリプルイーと読むんですね。754って番号はなんですか?

IEEEはたくさんの国際規格を定めていて、その規格すべてに番号を割り振っています。

浮動小数点表現は754番目の規格ということですね。

なるほど!!

それでは、IEEE794について学んでいきましょう。

正規化の方法

IEEE754では、2進数を以下の形に正規化します。

なんか、複雑になったなぁ。
10進数の時と比べると、ややこしくなってる気がしますね。
落ち着いて、一つずつ確認していけば大丈夫です!!

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

負の値だからといって、2の補数を意識する必要はないんですね?

そうなんです。負の値を記録するときは、一回「ー(マイナス)」を取って正の値で仮数と指数を求めて、

符号(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(アイトリプルイー)が定めた、浮動小数点表現の国際規格

次のスライドで、変換の練習問題を出しますよ。

Well done!

次のステップに進みましょう!

次のステップに進む

← 前のステップにもどる