0と1の隙間。PCから「小数点」を考える。

こんにちは!鳩豆です!

前回の「デジタル」を今更考えてみたよ、の記事に続き今回は0と1の隙間、、小数点の世界はPCではどうなっているのか考えてみたい。

PCでは2進数ベースであるものの、実際は色んな進数を組みわせて処理するらしい。
2進数で計算し、16進数に変換、はたまた10進数で表示する・・・・などなど。
す、すごい。

そこでふと疑問が湧いた。
そういえば小数点ってどうするんだろう?
2進数って桁が多いのに、さらに桁が小数点以下に付くと、いくら処理が早いからって流石に横に並びすぎじゃね?というショーもない疑問が湧いたのだった。

2進数で
1+1 は…10

もう桁が増えたーーー。

10進数の小数点
12.2は
2進数で
10110.00110011001100110011001100110011001100110011001100110011
(打ち切り)

桁が多っ。打ち切らないと大概、小数点部分は循環する。

この桁数をビットの情報に乗せるということはさらに(ものすごい雑に言うと)桁が増えることになる。
1文字も8ビットで表現する場合、この桁数は桁数だけですでに合理的じゃない。

と言うことで。
心配するまでもなくしっかり準備されていた。

PCでは浮動小数にして情報を渡すらしい。

「浮動小数点数」のwikiによると・・・・

浮動小数点数(ふどうしょうすうてんすう、英: floating point number)は、浮動小数点方式による数のことで、もっぱらコンピュータの数値表現において、それぞれ固定長の仮数部と指数部を持つ、数値の表現法により表現された数である。

うむ,なるほどー。
全くわからんわっ!!

文字の意味を調べて、その説明文が何一つわからん時の悲しみと言ったら・・・気を取り直して説明すると・・・・

12.345(10進数)を内部で処理する際に、

12.345を符号と指数と仮数に分けます。(そういえば習ったな〜)

符号(ビット先頭)は正の数なので符号は0、

12と0.345に分けて、
二進数に変換してみると・・・

12⇨1100と
0.345⇨010110000101000111101011100001010001111010111000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0がまだ多いので大変だ……
そこで小数点を左に移動させて1だけ残して表現すると、

1.100010110000101000111101011100001010001111010111000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
x(かける)
23

と表現できる。まだ多い・・・・

そこで今回は単精度のfloatで指数と仮数を32ビット(4byte)で表現する。

32ビットでは先頭が符号、後の8桁が指数部、残り23桁が仮数部となるので、

0 10000010 10001011000010100011110

結合すると、

01000001010001011000010100011110

12.345はと32bitのfloatでは↑で表現しているのだね…..ふう、やれやれ。

いつも処理とか、いろいろありがとうパソコン君!
ではまた!