2005年5月26日木曜日

2進法の小数

10進法の小数は,数直線上の点Pが 4と5の間に挟まれていれば
4.?
である.
4 と 5 の間を10等分して,Pが4から3個目に入っていれば4.2?
4.2 と 4.3 の間を10等分して,Pが4.2から9個目に入っていれば4.28?
4.28 と 4.29 の間を10等分して,Pが4.28から7個目の左側の等分点に一致すれば 4.286
である.
つまり10等分を続けて,
a/10+b/100+c/1000+d/10000+…
のとき小数 0.abcd… という表記になるイメージである.

これを2等分で考えて,左側に入れば,0,右側に入れば1にするのが2進小数.
コンピュータ内部の数値表現である.
2等分を続けて
a/2+b/4+c/8+d/16+…
のとき,a,b,c,d,… に 0,1 が入るとき 0.01001101… となるイメージである.

この方法で10進小数 0.1 を2進表記をすると,(実際の変換方法はサイトで検索すればいくらでも出てくるので,ここでは触れない)
1/10=0/2+0/4+0/8+1/16+1/32+0/64+0/128+1/256+1/512+…
となるので
0.00011001100110011…
という循環小数となる.
これを10進表記に直そうとすると当然
0.099999999…
という循環小数になる.
したがって,10進で有限小数であるといっても,2進では無限小数になる.

これを3倍した10進の0.3は,2進法では11倍して
0.010011001100110011001…
で,10進に変換すると 0.299999999…

これを5倍した10進の0.5は,2進法では101倍して
0.0111111111111111111111…
で,10進に変換すると 0.499999999…
しかし10進1÷2=0.5は2進1÷10=0.1である.

数学では 0.5=0.49999… なので,これでまったく問題はない.
0.49999… は 0.5 の別表記であるというのは数学では「定義」である.
>詳しくは 0.999…=1

しかし有限の桁数しか持てないコンピュータでは,無限小数の丸め方をどうするかというのは回路設計やプログラムの腕の見せ所となる.

0 件のコメント:

コメントを投稿

スパム対策のため,コメントは,承認するまで表示されません。
「コメントの記入者:」は「匿名」ではなく,「名前/URL」を選んで,なにかニックネームを入れてください.URL は空欄で構いません.