
こんにちは!鳩豆です!
前回の「デジタル」を今更考えてみたよ、の記事に続き今回は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では↑で表現しているのだね…..ふう、やれやれ。
いつも処理とか、いろいろありがとうパソコン君!
ではまた!