10進数、2進数、16進数の基数変換が分かったところで、小数の扱いについてもう少し詳しく書きましょう。
コンピュータの内部では、小数も当然2進数で扱われています。
では、どのように扱われているか考えてみましょう。
整数と同じく、10進数から考えてみます。
10進数「123.45」という数値を使ってみます。
これは、
100の位(10の2乗) が 1個 で 100 10の位(10の1乗) が 2個 で 20 1の位(10の0乗) が 3個 で 3
ここまでは、以前書きました。
位の部分に注目すると、「100の位」から「10の位」へは、「位」が10分の1になっています。
同様に、「10の位」から「1の位」へは、「位」が10分の1になっています。
小数部分についても同じで、「位」を10分の1にすれば良いのです。
0.1 の位(10の−1乗) が 4個 で 0.4 0.01の位(10の−2乗) が 5個 で 0.05
これらを全て加算して「123.45」となります。
2進数についても基本的な考え方は変わりません。
2進数「101.11」について考えます。
4の位(2の2乗) が 1個 で 4 2の位(2の1乗) が 0個 で 0 1の位(2の0乗) が 1個 で 1
ここまでは同じで、後は「位」を2分の1にしていけば良く、
0.5 の位(2の−1乗) が 1個 で 0.5 0.25の位(2の−2乗) が 1個 で 0.25
これらを全て加算すると、2進数「101.11」は10進数「5.75」になりました。
結局、整数部分は、「1の位」「2の位」「4の位」と2倍ずつ増えていくのに対し、小数部分は、「0.5の位」「0.25の位」「0.125の位」と2分の1ずつになっていきます。
では問題、10進数「12.6875」は、2進数でいくつでしょうか?
8の位 が 1個 で 8 4の位 が 1個 で 4 2の位 が 0個 で 0 1の位 が 0個 で 0 0.5の位 が 1個 で 0.5 0.25の位 が 0個 で 0 0.125の位 が 1個 で 0.125 0.0625の位 が 1個 で 0.0625
全て加算すると10進数「12.6875」で、2進数では「1100.1011」です。
さて、2進数での小数の表現を勉強したところで、次の計算を考えてみます。
10進数「1÷3」の答えは?
0.333333333・・・
ですよね。
見てのとおり、ず〜っと3が繰り返されます。
こういった小数を「循環小数」といいます。
もう1つ見てみましょう、10進数「1÷7」の答えは?
0.142857142857142・・・
同じように「142857」という数値が、ず〜っと繰り返されます。
ずっと繰り返されてしまい、表現できないので、10進数では便利な「分数」というものがあります。
2進数ではどうでしょう?
10進数「0.1」を2進数に直してみます。
整数部分はゼロですから、最初は「0.」となります。
小数以下の位は次のようになります。
0.5 の位 が 0個 で 0 0.25 の位 が 0個 で 0 0.125 の位 が 0個 で 0 0.0625 の位 が 1個 で 0.0625 0.03125 の位 が 1個 で 0.03125 0.015625 の位 が 0個 で 0 0.0078125 の位 が 0個 で 0 0.00390625 の位 が 1個 で 0.00390625 0.001953125 の位 が 1個 で 0.001953125
ここまでの数値を全て加算すると10進数で「0.099609375」となります。
10進数「0.1」に近づいていますが、まだ不足しています。
この時点での、2進数では「0.0(0011)(0011)」となっています。
この後計算をずっと続けていくと、この(0011)という数値が繰り返し出てきます。
10進数「0.1」には近づきますが、「0.1」ぴったりにはなりません。
これも、循環小数なのです。
10進数にしても、2進数にしても表現しきれない数があるのです。
10進数の場合は便利な「分数」という表現手段があるのですが、コンピュータ内部の2進数にはありません。
「電卓」を思い浮かべてください。
ほとんどの(簡易型)電卓で分数は扱えません。
「1÷3」や「1÷7」などの循環小数は途中で計算が打ち切られているか、どこかで四捨五入等の措置がとられています。
計算が打ち切られたり、四捨五入されたりすることにより「誤差」が生じます。
コンピュータ内部での2進数による小数の扱いも同じで、表現しきれない部分は「誤差」として残ってしまいます。
「変数について」でも書きましたが、整数や小数を入れる「変数」にはサイズがあります。
サイズを超えて値を入力することは出来ませんので、「誤差」が出ることがあるのです。
コンピュータは万能ではありません、どんな大きな数やどんな小さな数でも扱えると思うかも知れませんが、実は出来ないのです。
※非常に大きな数や非常に小さな数を扱おうとした場合、扱えるようにプログラミングする必要があります。
このコラムで紹介した小数の表現方式は「固定小数点」という方式です。
「小数の表現3」では、実際にコンピュータ内部でどのように「小数」が表現されているかを見てみましょう。
ブラウザの戻るボタンで戻ってください。