【情報Ⅰ共通テスト対策】授業の実況中継(補数・浮動小数点数)

6081

みなさん、こんにちは。

前回の「2進数・16進数」に続いて

今回の授業では『補数・浮動小数点数』について学びます。

6062【情報Ⅰ共通テスト対策】授業の実況中継(2進数・16進数)
  • 補数とは〜コンピュータにおける「負の数」の表し方
  • 補数の求め方
  • 浮動小数点数とは〜コンピュータにおける「実数」の表し方
  • 浮動小数点数の求め方

これらを理解してほしいと思います。

注意

授業を受けている生徒の理解促進のため、わかりやすさを重視しています。そのため専門的な人から見ると「おや?」という表現ある場合があります。なるべく誤解にならないように表記していますが、予めご了承ください。

ややこしい部分もありますが最後までどうぞお付き合いください。

補数

補数とは〜コンピュータにおける「負の数」の表し方

前回の授業でもお伝えしましたが、

コンピュータは、0と1だけを使った数字のシステム(数字の形)で表現(画面に表示)します。

その根本的な考え方となる2進数について学びました。

ただ例として挙げた数字・計算の全てが「正の数」なのです。

では、コンピュータが「負の数」をどのように表すのでしょうか。

コンピュータ内部では、負の数を直接表現することができません。

そのため、特別な方法を使って負の数を表現します。

その方法が「補数」を使った表現です。

2進数では各桁の0と1を反転し、1を加えて求めます。

補数の求め方

補数は、各ビットの数値を反転させることで求めます。

つまり、0を1に、1を0に変換します。

そしてその後1を加えます。

例 8ビットの二進数「01101001」(10進数で105)の補数

 

手順

まず各ビットの数値を反転し、その後に1を加えます。

01101001 (元の値)
↓
10010110
+      1
--------
10010111 (2の補数)

したがって、「01101001」の補数は「10010111」です。

これで補数の求め方がわかりました。

ちなみにこのやり方で求めた補数は「2の補数」と言います。

「1の補数」もありますが、それは「各ビットの数値を反転する」だけで求めることができます。

補数について詳しい説明を割愛していますが、この「2の補数」を利用することで

  • 負の数を表す
  • 加算(足し算)だけで減算(引き算)も表す

これらのことを叶えることができるのです。

それでは続いては浮動小数点数について触れていきます。

浮動小数点数

浮動小数点数とは〜コンピュータにおける実数の表し方

ここまで正の数、負の数の表し方を見てきました。それでは、

次に、コンピュータがどのように実数(小数を含む数値)を表現するかを見ていきましょう。

実数は、整数だけでなく小数や無理数なども含む数値です。

実数を効率的に表現する方法として、浮動小数点数があります。

浮動小数点数は、非常に大きな数や非常に小さな数を効率的に表現するための方法です。

浮動小数点数は次の形式で表現されます。

符号部 指数部 仮数部 

浮動小数点数は

「符号部 指数部 仮数部」 の順番で記します。

これだけでは「何のこっちゃ?」だと思いますのでもう少し詳しく説明します。

浮動小数点数1

浮動小数点数の求め方

ここからは実際に、実数を浮動小数点数を使って求める方法を順に説明します。

たとえば「6.75」を例にとってみてみましょう。

今回は、16ビットの2進数の浮動小数点数(符号部1ビット、指数部5ビット、仮数部10ビット)で表します。

①まずは10進数を2進数に変換する

まずは浮動小数点数を使って表現したい10進数の数字を2進数に変換します。

6.75 = 6 + 0.75

と分解します。そして整数部分と小数部分をそれぞれ2進数に変換します。

2進数に変換する際は前回の授業で紹介した「桁の重み」を使いましょう。

10進数の「6」:

 6 = 4 + 2 → 2進数では「110」

10進数の「0.75」:

 0.75 = 0.5 + 0.25 → 2進数では「0.11」

小数第一位の桁の重みは2の1/2乗 = 0.5、第二位の桁の重みは2の1/4乗 = 0.25です。

これにより、10進数の「6.75」は「110.11」と表すことができました。

2進数への変換
10進数の数字を2進数へ変換します。

②変換した2進数を数値を正規化する

「正規化」という初めて聞く言葉が出てきたかと思いますが

正規化とは、数値を「1.xxxx × 2^n」の形式に変換することです。

2進数「110.11」を正規化する手順は以下の通りです:

  1. 小数点の位置を1ビット目の右隣に移動する(「1.xxxx」になるようにする)
    • ①で求めた2進数「110.11」を「1.1011」の形式になるようにします。
  2. 移動した桁数を指数として表す:
    • 小数点を移動する際の桁数を指数として記録します。
    • 「110.11」を「1.1011」に正規化した場合、小数点を左へ2つ動かしています。この「2」が指数部となります1.xxxx × 2^n)の「n」の部分。この数字は後ほど使います。

繰り返しになってしまいますが、

「110.11」を正規化するとき、小数点を2桁左に移動させて「1.1011」の形式にします。

この移動により、数値の倍率が変わりますから、移動した分だけ指数部に反映させるのです。

  • 元の数値:110.11
  • 正規化した数値:1.1011
  • 小数点を2桁左に移動したので、指数部は2になります。

※実際の指数が「2」となる

浮動小数点数の正規化
浮動小数点数の正規化

これで、浮動小数点数で表すための

符号部 指数部 仮数部 

指数部がわかりました。

浮動小数点数(正規化)
1.xxxx.X 2^n の形式に直す

③仮数部の決定

続いては、仮数部を求めます。

先程、②で正規化した数値を求めました(「1.1011」)。

この数値から小数部分(「1011」)を抜き出し仮数部の箱に左詰めで入れていきます。

足りないビットは0を入れます。

今回は10ビットで仮数部を表現しますので、「1011」を左づめで入れても6ビット分余ります。余った6ビットには0を詰めましょう。

仮数部:「1011000000」 (10ビットにするため、右側に0を追加)

浮動小数点数(仮数部の決定)
仮数部に2進数の小数部分を当てはめる

④指数部の決定

指数部に充てられているビット数は問題で指定されていることが多いですが、

指数部は「実際の指数 + バイアス」で求め、

求めた10進数の数字を2進数へ変換します。

指数部は「実際の指数+バイアス」で求められるものの、

浮動小数点演算の標準規格としてIEEE 754 があり、

次のようば表現が決まっています。

  • 半精度浮動小数点数→16ビットで表す
    • 符号部:1ビット
    • 指数部:5ビット
    • 仮数部:10ビット

先程の例では、

  • 実際の指数 → 2
  • バイアス → 15

よって、

指数部 = 実際の指数 + バイアス = 2+15 = 17

この「17」を2進数に変換します。

桁の重みを利用すると、17 = 16 + 1 なので、2進数に変換すると「10001」となります。

これで、指数部が「10001」と求められました。

浮動小数点数(指数部の決定)
実際の指数+バイアスで求めた数字を2進数に変換します

⑤符号部の決定

最後に符号部を求めます。

符号部は元の数字から判断しましょう。

元の数字の符号が正なら0、負なら1を符号部のビットに入れましょう。

今回は符号は正なので、0を符号部に入れます。

浮動小数点数(符号部の決定)
元の10進数が正の数なら「0」、負の数なら「1」を符号部のビットに当てはめます

これらの手順を全て踏まえると、

6.75=110.11の浮動小数点数は

符号部 指数部 仮数部 

の順番で表記するので、

符号部 指数部 仮数部 :0 10001 110100000

となります。

手順が多く煩雑な印象がありますが、これで浮動小数点数で表現することができました。

まとめ

今回は補数・浮動小数点数についてお伝えしました。

手順が煩雑で難しい印象を抱くかもしれませんが、問題演習などで慣れるようにしていきましょう。

それではまた次回!