【離散数学】2進数によるさまざまな数値の表現

ビットとバイト

コンピュータが処理を行うときのデータの最小単位をビットという。ビットは2進数1桁を表すbinary digitの略。
さらに8ビットをひとまとまりとして扱う単位がバイトという。

固定小数点数形式

2進数を使った数値の表現方法の一つ。 - 表現する数値の大きさによって8ビット、16ビット、32ビットなどを使い分ける。
- たとえば8ビットの固定小数点数形式は0~255の範囲の数値が表現できる - 小数点を最下位ビット(LSB: Least Significant Bit)に固定し整数を表す - 最上位ビット(MSB: Most Significant Bit)で符号を表すことで、負数を表現することもできる - 符号ビットは0ならば正、1ならば負の数を表す

補数表現

ある数nに足すと1.0*10mになる数を、nの補数という。
例:10進数の530は470を足すと1000になるため、470は530の3桁の補数

補数のメリット

補数を使うメリットは「足し算で引き算ができる」ことである。

980 - 530 = 450
980 + 470 = 1450

530の補数470を用いて加算を行い、最上位桁の1を省くと、530による減算の結果と同じになる。

補数の求め方

2の補数は2進数において負の数を表現する際に用いられる。
求め方は符号ビットも含めた全てのビットを反転したもの(1の補数)に1を加算する。

# +2
00000010
# -2
11111110

# +126
01111110
# -126
10000010

10進数の100-17を8ビットの固定小数点数で計算してみる。
まずは-17(17の2の補数)を求める。

# +17
00010001
# -17
11101111

100+(-17)を行い、桁溢れを無視する。

  01100100 # 100
+ 11101111 # -17
---------------
 101010011

01010011(10進数の83)が求められる。

浮動小数点数形式

数値 = 仮数 * 基数と表す形式。

例:11000000 = 0.11*2^8

仮数部で有効桁数を確保し、指数部で数の大きさを表すことで、限られたビット数でとても大きい数値や小さい数値を表現できる。

浮動小数点数形式への格納

単精度形式(32ビット)

SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM

S: 仮数部の符号ビット(1ビット)
E: 指数部(8ビット)
M: 仮数部(23ビット)

仮数部を有効に使う(切り捨てをなくす)ため、仮数部の最上位ビットが0にならないよう、仮数部と指数部を調整する(正規化)。

誤差

仮数部で発生する誤差
1. 丸め誤差

浮動小数点数では仮数部の桁数が有限なので、無限小数は四捨五入、切り上げ、切り捨てなどによる誤差が発生する。

2. 桁落ち

絶対値のほぼ等しい2つの数値を減算したときに、有効数字の桁数が急激に減少することで誤差が発生する。

1.110100101*2^3 - 1.110100010*2^3 = 0.000000011*2^3

正規化すると

1.100000000*2^(-5)

となり、有効数字の桁数は10桁→2桁に減少する。

3. 情報落ち

絶対値の差が非常に大きい2つの数値の加減算を行ったときに、絶対値の小さい方の値が有効桁数内に収まらず演算結果に反映されないために発生する。

2^600 - 2^(-600) = 2^600
4. 打ち切り誤差

ある程度の値で収束が確認できたところで処理を打ち切ることで生じる誤差。演算結果が有効桁数では表現できない場合などに発生する。

指数部で発生する誤差
1. オーバーフロー

非常に絶対値の大きな値同士の乗算を行った指数部が表現しうる正の最大値を超えることがあり、このときに誤差が発生する。

2^600 * 2^600 = 2^1200 

指数部が8ビット=1024までしか格納できないため誤差が発生する。

2. アンダーフロー

非常に絶対値の小さな値同時の乗算を行った場合。オーバーフローの逆。