数値表現と演算精度

Last-modified: 2019-06-20 (木) 18:34:06

学ぶこと

固定小数点表現
浮動小数点表現
2の補数表現

  • バイアス127(IEEE754の形式とバイアス値)

固定小数点表現

浮動小数点ほど出題数は多くないにしても、「出ない」とは言い切れない。
とはいえ、考え方は浮動小数点ほど難しくもない。

実は小数を扱う場合は「浮動小数点」が一般的。

じゃあどうしてやるんだろうという疑問はさておいて。

小数点の位置が固定だからこの名称。

固定小数点表記例

4桁目の後ろに小数点があり、2進数を8bit表現した例。

beforeafter
0.10000.1000
1.1010001.1010
0.00110000.0011

ここで注意したいのは負数表記。最上位ビット(一番左のビット)は符号を表すことに注意する。

最上位ビットが1ならば-、0ならば+。

つまり

beforeafter
-0.11000.1000

となるため「1000…?」ってならないように注意。

浮動小数点表現

これは、学び始めの壁の一つ。

数学の指数表現を利用する。

これをこう表す
1010^1
110^0
0.110^-1
0.000110^-4

これを見て「そういうことね」ってなればまずOK。
わかりやすいように10進数表記でやりますが、本番は2進数表記が殆どで、10進数表記の問題は滅多に見ないぞ。
理解してほしいのは 桁数・小数点の位置を表記するために指数を使うということ。

追いついてきてね。

表現例'

10進数を例とする。

これをこう表す
123.456123456 * 10 ^ -3

2進数を例とする。

これをこう表す
101.011101011 * 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を補数表現へと変換させる。)

これをこうしてこうじゃ
001111001101

こうすると、「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.2510進数
111.012進数
111.01 = 1.1101 * 2 ^ 21.***の形にする。小数点以下1101仮数
仮数 : 1101000000000000000000023bitに仮数をそろえる。
指数 : 10000001127 + 2(指数) = 129 = 10000001
符号 : 0プラスだからね
01000000111010000000000000000000符号の0 + 指数の10000001 + 仮数の11010000000000000000000