n進数という名前が出てくると「うっ頭が…」ってなる人のn進数講座（4）〜小数点を使った表現〜

基本情報技術を学んだ事がある人、学んでいる最中の人がいずれも悩んだ事があるだろうn進数の計算。
自分もその一人でした…。ですが、その状態から脱却すべく必死になって勉強した結果ある程度はわかる様になったので自分なりにわかりやすく解釈したものをここに残そうと思います。

今回は第4弾ということで…。

実は前回で最後と思っていたのですが、追加することにしました（笑）
ちなみに前回の記事は以下の通りになります。

[n進数という名前が出てくると「うっ頭が…」ってなる人のn進数講座（1）〜n進数の基本変換について〜](https://qiita.com/waka-ken/items/5658706c43303297784f)

[n進数という名前が出てくると「うっ頭が…」ってなる人のn進数講座（2）〜2進数の足し算、引き算について〜](https://qiita.com/waka-ken/items/7e4b327cf1b368b541cc)

[n進数という名前が出てくると「うっ頭が…」ってなる人のn進数講座（3）〜2進数の掛け算、割り算について〜](https://qiita.com/waka-ken/items/490f0300b6e8c2346fba)

今回は2進数を用いた小数点の表し方を紹介していきます。

#■小数点を使った表現方法

実は一言に小数点を使った表現としてもコンピュータの世界で小数点を使った表現には2種類あります。
それが「**固定小数点数**」と「**浮動小数点数**」です。

以下特徴になります。

固定小数点数・・・小数点の位置を**あらかじめきめてしまう**やり方

浮動小数点数・・・小数点の位置を**任意に変更できる**やり方

まぁ、当然文字だけでこういわれてもわかりにくいですよね…（笑）

ってことでそれぞれについてもう少し詳しく説明していきます。

##固定小数点数

先補と説明した通り、固定小数点数とは小数点の位置をあらかじめ決めておくとありますが、
これ結構曖昧な表現だと思っていまして、実は固定といいながら問題で出てくるときは毎回変わります…（笑）

例えば、「8ビットの固定小数点数を用いて10進数を2進数で表現せよ。」って問題の場合その後の文に大体こう続きます「ただし固定小数点の位置は3と4桁の間とする」
とこのように問題文の中に小数点の位置を決めるための文が入ることがほとんどなんですよね。

コンピュータの場合は常に再開のビットの右側（上記の問題でいうと「0と1桁」の間）に小数点を置くことを定義しています。

###ちなみに固定小数点数が表示できる整数の範囲はというと…

**☆符号なし（8ビット）**

2進数・・・00000000～11111111

↓これを10進数におきかえると…

10進数・・・0～255

よってnビットで表現できる範囲は**0～2^n-1**

**☆符号あり（8ビット）**

2進数・・・10000000～01111111

↓これを10進数におきかえると…

10進数・・・-128~+127

よってnビットで表現できる範囲は**-2^(n-1)～2^(n-1)-1**

となる。

##浮動小数点数

固定小数点数に対して浮動小数点数とは何ぞ！？と思われるかもしれませんが、何のことはありませんただの指数表記です。

例えば、15000とかの数字を15x10^3で表記する方法と考えてOK！

ただここではn進数で表記する必要があるので以下のような式になります。

**±(符号) 0.m(仮数) x n(基数)^e(指数)**

例）-0.1011×2^-5を浮動小数点数で表現すると

まず上記の式に当てはめます。

符号・・・-(マイナス)なので「1」

仮数・・・「1011」は2進数表記なのでそのまま

指数・・・-5は2進数表記すると「0000011」
ただー（マイナス）なので、これを2の補数で表すと「１１１１１０１」
（指数は７ビットで表すものと考える）

最後にこれを**符号→指数→仮数**の順で表記する

答えは**11111101.1011000…**となる（小数点位置は仮数と指数の間に入る）

##正規化

浮動小数点数には正規化と呼ばれるものがあります。

例）「0.00012345を浮動小数点数で表現せよ」という問題があったとします。

①・・・0.12345x10^-3
②・・・0.012345x10^-2

①と②は全く同じ数字を表しています。
極論どちらでも正解です。

ですが…ここで正規化の考え方が出てくるのです！
正規化とは簡単にいうと「**表示桁数をできるだけ少なくする**」です！
そのためこの場合は①の場合が正解となるわけなのです。

##よく使われる浮動小数点数の形式

###32ビット形式

全体を３２ビットで構成する表示形式。
符号・・・１ビット（０：正、１：負）
指数・・・７ビット（２を基数とし、負の数は2の補数で表現）
仮数・・・２４ビット（２進数、絶対値表示）　　

計３２ビット

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 符号(1)  | 指数部(7)  |   |   |   |   |   |   |仮数部（２４）   |   |
| ± | 0  |  0 |  0 | 0  | 0  | 0  | 0  | 0  |  0 | 0  |  0 |  0 | 0  | 0  | 0  | 0  | 0  |  0 | 0  |  0 |  0 | 0  | 0  | 0  | 0  | 0  |  0 |0  | 0  | 0  |  0 |


###IEEE754の形式

３２ビットで表すのは上記と同じですが、以下の点で違いがあります。
符号・・・１ビット（０：正、１：負）
指数・・・８ビット（２を基数として＋１２７する　→バイアス１２７＊（１））
仮数・・・２3ビット（仮数−１で表示＊（２））

＊（１）バイアスの考え方・・・実際の数でなく予め＋１２７しておくことで大小表現をわかりやすくしている
＊（２）仮数−１の考え方・・・元は0.mが、小数点の位置をひとつずらすことで1.mつまり表示桁数を一桁分増やすことができる

例）-0.1011×2^-5をIEEE７５４形式で表す場合

まず正規化しなおす・・・−**1.011**x2^**-6**

符号・・・-（マイナス）であるから「１」
指数・・・−6をバイアス表現する→「-6＋１２７＝１２１」
さらに「１２１」を２進数表現にしなおすと「０1111001」
仮数・・・「011」

結果**101111001.01100…**となる


#■最後に

以上が小数点に関する表現方法の種類についてでした！

少し自分も理解が曖昧な部分があるため、間違いがあるかもだがその時はご指摘していただくと嬉しいです。

ではまた次回の記事にて！！