学ぶこと
- バイアス127(IEEE754の形式とバイアス値)
固定小数点表現
浮動小数点ほど出題数は多くないにしても、「出ない」とは言い切れない。
とはいえ、考え方は浮動小数点ほど難しくもない。
実は小数を扱う場合は「浮動小数点」が一般的。
じゃあどうしてやるんだろうという疑問はさておいて。
小数点の位置が固定だからこの名称。
固定小数点表記例
4桁目の後ろに小数点があり、2進数を8bit表現した例。
| before | after |
| 0.1 | 0000.1000 |
| 1.101 | 0001.1010 |
| 0.0011 | 0000.0011 |
ここで注意したいのは負数表記。最上位ビット(一番左のビット)は符号を表すことに注意する。
最上位ビットが1ならば-、0ならば+。
つまり
| before | after |
| -0.1 | 1000.1000 |
となるため「1000…?」ってならないように注意。
浮動小数点表現
これは、学び始めの壁の一つ。
数学の指数表現を利用する。
| これを | こう表す |
| 10 | 10^1 |
| 1 | 10^0 |
| 0.1 | 10^-1 |
| 0.0001 | 10^-4 |
これを見て「そういうことね」ってなればまずOK。
わかりやすいように10進数表記でやりますが、本番は2進数表記が殆どで、10進数表記の問題は滅多に見ないぞ。
理解してほしいのは 桁数・小数点の位置を表記するために指数を使うということ。
追いついてきてね。
表現例'
10進数を例とする。
| これを | こう表す |
| 123.456 | 123456 * 10 ^ -3 |
2進数を例とする。
| これを | こう表す |
| 101.011 | 101011 * 2 ^ -3 |
数値を A * B ^ C と表現するのが浮動小数点表現。
そしてこれらのA,B,Cには呼び名がある。
Aを仮数、Bを基数、Cを指数と呼ぶ。
主に、基数が2や10の問題が出るけど、時々ひねくれた問題で基数が7、つまり7進数の問題が出されたりする。
浮動小数点って、プログラムの型によく使われるよね、float型とか。
2の補数表現
APよりもFEで出る印象の多い補数表現問題。
補数とは、2進数のマイナス値表現のこと。
例えば、10進数で「5-3」をやる場合、2進数だと0101 - 0011となり…たいところだが、
減算に於いては加算で表現するのが2進数であり、その減算を表現するのが補数表現だ。
表現方法は簡単。
1. 0と1を反転させる。
2. 1を足す。
以上。
先ほどの「5-3」を再度例する。(3を補数表現へと変換させる。)
| これを | こうして | こうじゃ |
| 0011 | 1100 | 1101 |
こうすると、「5-3」は「5+(-3)」と表せて、計算がうまくいく。
0101 + 1101 = 0010 となるね。
バイアス127(IEEE754の形式とバイアス値)
IEEE754にて制定された、浮動小数点表現の方法。
なんでそんな制定なんでされるんじゃ、覚えるのめんどいやろがいって思うけど、
浮動小数点表現って、昔は複数種あって、表現に困ったんだよね。
だからIEEE754でバイアス127という方法が決まった。
ここではバイアス127の中で用意されている32bitVer.を使う。
他には64bitVer.がある。以下、32bit(単精度という)を例とする。
浮動小数点表現は、固定小数点表現同様、最上位ビットが符号を表現し、
指数部に8ビット、仮数に23ビットの計32ビットで構成される。
指数部に8bitということは…
とんでもない累乗ができるのでは…?
というかマイナス値表せないのでは…?とならないように、
バイアス値と呼ばれる127を指数部に足すんだ。
補数表現を思い出してほしい。先頭に1がある表現を用いてマイナス値を表してる。
さらに、バイアス127では、仮数部を1.***で表すようにしなさいと決められている。
はて、なんのこっちゃ。実例。上から順に変換されるよ。
| 7.25 | 10進数 |
| 111.01 | 2進数 |
| 111.01 = 1.1101 * 2 ^ 2 | 1.***の形にする。小数点以下1101が仮数 |
| 仮数 : 11010000000000000000000 | 23bitに仮数をそろえる。 |
| 指数 : 10000001 | 127 + 2(指数) = 129 = 10000001 |
| 符号 : 0 | プラスだからね |
| 01000000111010000000000000000000 | 符号の0 + 指数の10000001 + 仮数の11010000000000000000000 |