俺氏、本を読む

30歳になるまでに本を読んで勉強しようかと。主に啓発、お金についての本を読むつもり。一応プログラマーなのでその辺のことも。あと、せどり(転売)の仕入れ見込み商品をリサーチして仕入先と一緒に投稿します

離散数学

離散数学とは、とびとびの数字を扱う数学です。
コンピュータは、データを0か1の2種対の値(ディジタル)でしか表現できません。
その制限の中でどのようにデータを変換して表現するかに、離散数学は活用されています。

基数変換

基数とは、数を表現するときに、けた上がりの基準になる数です。
例えば、10進数では基数が10なので、0,1,2,3,4,5,6,7,8,9ときて
10になるところでけた上がりをして10になります。
同じように、2進数では基数が2なので、0,1ときて2になるところで
けた上がりして10になります。
例えば、2進数の (110.01)₂は10進数では次のように表現します。
なお、下付きの数字は基数を表しています。
(110.01)₂ = 1×2² + 1×2¹ + 0×2⁰ + 0×2⁻¹ + 0×2⁻² = (6.25)₁₀

負の数の表現(補数表現)

コンピュータ上で負の数を表す場合は、補数という考え方を使います。
補数とは、ある自然数に足したときにけたが一つ上げる最も小さい数です。
例えば、8けたの2進数(00001101)₂の2の補数は、足すことでけたが上がって
9けたの最小値(100000000)₂になる値です。計算すると次のようになります。
 
  00001101 元の数 (13)₂
+ 11110011 2の補数 (-13)₂
―――――――――――――――――
 100000000 けたが一つあがる最小値
 
2の補数の求め方としては、各ビットを反転して、それに1を加える
ことによって、簡単に計算できます。
この補数を用いることによって、引き算を足し算で表現できます。
例えば、(25)₁₀ - (13)₁₀を計算するときには、次のように変換します。
 
(25)₁₀ - (13)₁₀ = (25)₁₀ + (-13)₁₀
 
8けたの2進数に変換すると、先ほどの2の補数表現より
(11110011)₂ = (-13)₁₀なので、次のようになります。
 
  00011001 引かれる数 (25)₁₀
+ 11110011 2の補数   (-13)₁₀
―――――――――――――――――
 100001100 計算結果  (12)₁₀
※あふれたけたは無視されます。
 
引き算を足し算に直すことで計算の種類を減らすことができ、
計算に必要なコンピュータの回路を単純にできます。

少数の表現

小数をコンピュータ内部で表現する方法には、次の2種類があります。
固定小数点数表現
浮動小数点数表現

 

固定小数点数表現

あらかじめ小数点の位置を決めておき、その位置に合わせて
データを表現する方法です。
例えば、2進数の(110.01)₂を表現するとき、8けた分の場所を
確保し、4けた目の後を小数点にすると決めると、次のようになります。
 
0110.0100
 
小数点の位置が決まっているためデータの解釈は簡単なのですが、
その分、表現できる数値の範囲が限られてしまいます。
例えば、8けたで4けた目の後を小数点とするとき、最大値でも
(1111.1111)₂ = (15.9375)₁₀となり、大きな数は表現できません。

浮動小数点数表現

浮動小数点数表現では、指数部と仮数部を使って数値を表現します。
例えば、10進数の0.000603は、10進数の浮動小数点数表現を使うと
次のように表されます。
 
0.000603 = 6.03(仮数部) × 10⁻⁴(⁻⁴が指数部)
 
2進数の場合には、指数部を2のべき乗のかたちにし、符号部(数値が
プラスなら0、マイナスなら1)と合わせて表現します。
具体的な方法はいろいろありますが、決められた形式のルールに
したがって数値を変換します。正しい形式に変換するこの作業を
正規化と呼びます。
 
次の16ビットの浮動小数点形式において、10進数0.25を正規化する
例を記載します。ここでの正規化は、仮数部の最上位けたが1になる
ように指数部と仮数部を調節する操作とします。
 
[s(1ビット)] + [e(4ビット)] + (小数点) + [f(11ビット)]
s:仮数部の符号(0:正、1:負)
e:指数部(2を基数とし、負数は2の補数で表現)
f:仮数部(符号なし2進数)
 
10進数の0.25を2進数にすると、(0.25)₁₀ = (0.01)₂となるので、
これを仮数部の最上位けたが1になるように浮動小数点数表現に
すると、次のようになります。
 
(0.01)₂ = (0.1)₂ × 2⁻¹
(0.1)₂ の 1 が仮数部(f)
2⁻¹ の ⁻¹ が指数部(e)
 
また、指数部(e)は(-1)₁₀なので、4ビットの2の補数で表現すると、
次のようになります。
 
(-1)₁₀ = (10000)₂ - (0001)₂ = (1111)₂
 
したがって、浮動小数点数表現で(0.25)₁₀を表すと、
 
s:仮数部の符号 ・・・ 正なので「0」
e:指数部 ・・・・・・ 上記で求めた「1111」
f:仮数部 ・・・・・・ 1だが、11ビットなので後ろに0を補って「10000000000」
 
となり、合わせて「0 1111 10000000000」となります。