アットウィキロゴ

第2回 実数表現とコンピュータの限界


前回の復習
  • 16進数を10進数にするには
345(16)を10進数にするには、
いちばん右を1の位、その左を16の位、次を16×16=256の位、として位取りする。
その後に、対応する係数と掛けて加える。すなわち、
345(16)=3×256+4×16+5×1=768+64+5=837(10)

  • 10進数を16進数にするには
1234(10)を16進数にするには、
 1234÷16=77...2、77÷16=4...13、4÷16=0...4、より、4D2(16)を得る。

2.2進数と16進数

  • 2進数は0と1で数を表現するものである。
2進数の位取りは、小さいほうから、1、2、4、8、16、32、64、...と2倍になる。
位取りに対応する係数を掛けて加えるので、
1011010111 であれば、
 512+0+128+64+0+16+0+4+2+1=727 がわかる。
係数が0の位取りは加えず、1になっているところだけ加えれば、対応する10進数が得られる。

  • 16進数は2進数で4ケタである。
この性質を使うと、2進数⇔16進数の変換がものすごく楽になる。次は対応表である。
10進数 16進数 2進数
0 0 0000
1 1 0001
2 2 0010
3 3 0011
4 4 0100
5 5 0101
6 6 0110
7 7 0111
8 8 1000
9 9 1001
10 A 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111
16 10 10000

  • 2進数「1011010111」をまず16進数に直す。
これは、下から4ビットずつに区切り、対応表で16進数に変換する。
10 1101 0111 (2)⇒ 2D7(16)
このあと、16進数を10進数にすると、2×256+13×16+7=727 が得られる。
計算回数は少なく、計算ミスも少なくなることが期待される。
逆に10進数から2進数に直す場合も、一度16進数に直してから計算すると楽になる。

数当てゲーム

次の4枚のカードを作る。
1枚目・・・1、3、5、7、9、11、13、15
2枚目・・・2、3、6、7、10、11、14、15
3枚目・・・4、5、6、7、12、13、14、15
4枚目・・・8、9、10、11、12、13、14、15
[セリフ] 1~15までの数を1つ思い描いてください。
 その数を当てます。たとえば、1枚目と3枚目と4枚目にその数字があるものは「13」です。

《答え》
1枚目と3枚目と4枚目にある数は、それぞれのカードの最初の数を加えて、1+4+8=13なのです。

  • 上記のゲームは、まさしく2進数の本質を表している素晴らしいものです。
 このように感じてくれる方は、2進数の仕組みが理解できた方です。

(カードの作り方)
1枚目・・・右から1ビット目が1になっている数(奇数)
2枚目・・・右から2ビット目が1になっている数
3枚目・・・右から3ビット目が1になっている数
4枚目・・・右から4ビット目が1になっている数

としてカードを作ります。
たとえば、「13」は2進数に直すと「1101」なので、1枚目と3枚目と4枚目のカードに数があるのです。

実数の表現について

たとえば、10進数の「345.67」は、100×3+10×4+1×5+0.1×6+0.01×7 を表現しています。
これは、100\times 3+10\times 4+1\times 5+\frac{1}{10}\times 6+\frac{1}{100}\times 7
なので、16進数の「345.67」は、
16^2\times 3+16\times 4+1\times 5+\frac{1}{16}\times 6+\frac{1}{16^2}\times 7=256\times 3+16\times 4+5+0.0625\times6+0.003906\times 7=837.402342
になります。

【例題】10進数「345.67」を16進数に直すには
(解答)
  • 整数部分「345」
 通常通り、345÷16=21...9、21÷16=1...5、1÷16=0...1、となるので、最後から余りを並べて「159」を得る。
  • 実数部分「0.67」
 これは、どう考えればよいかというと、10進数なら10倍した数の整数部分に「小数第一位」の数が来ます。これを使います。
 すなわち、16進数にしたければ、16倍して整数部分に来る数を並べればよいのです。
  すると、0.67×16=10.72
      0.72×16=11.52
      0.52×16=8.32
      0.32×16=5.12
      0.12×16=1.92
      0.92×16=14.72
      0.72×16=11.52 ⇒ この部分で上から3番目になるので、計算が循環することがわかる。
 これより、0.AB851EB851EB851E\dots=0.A\dot{B}851\dot{E} (循環する最初の数と最後の数に点(・)を打つきまりがあります)
がわかります。

0.1は正しく表現できない!

10進数の「0.1」を上の方法で16進数に直すと、
0.1_{(10)}=0.199999999\dots=0.1\dot{9}となることが分かります。
これは、10進数の0.1を16進数で表すと、無限桁が必要になることを表しています。

コンピュータは電気信号のON(1)、OFF(0)だけで情報を表現するので、基本的に2進数しか扱えません。
10進数は2進数で表現されます。16進数1桁は2進数4桁ですから
0.1_{(10)}=0.0001\dot{1}00\dot{1} となります。
これも無限桁です。パソコンで扱えるメモリは有限ですから、どこかの桁で切り落とされます。
このとき、表現誤差が生じてしまいます。

すなわち、コンピュータで10進数の「0.1」は正確に表現できないことになります。
つまり、「0.1を10回加えても、1.0にならない」のです!

これがコンピュータの弱点で、実はコンピュータは正確な計算は苦手なのです。

今日の話題に感想を述べてください。(名前欄に学生番号を記入すること) 質問も結構です。必要に応じて、回答します。

  • 今日も頑張りたいです -- 12122799 (2013-10-03 10:15:29)
  • iPhone5s等の最新の話題大好きです。 -- 12130774 (2013-10-03 10:38:21)
  • 今日の授業の0.12×16の計算から違う気がします。 -- 12120452 (2013-10-03 11:30:49)
  • 進数楽しいです -- 12132841 (2013-10-03 14:26:31)
  • 進数頑張りたいです -- 12134160 (2013-10-06 02:25:45)
  • 教授のiPhoneの話の流れがおもしろいです。 -- 12120333 (2013-10-06 06:24:51)
  • 後期は計算が多くて大変ですが頑張ります -- 12120232 (2013-10-07 14:14:03)
  • iPhoneの話が興味津々でした。 -- 12131237 (2013-10-08 14:15:44)
  • 2進数と16進数の関係は知らなかったので参考になりました -- 12122161 (2013-10-08 17:51:28)
  • iPhoneの話しが面白かったです -- 12122496 (2013-10-09 13:44:41)
  • 進数理解するのは大変だけどできたときの楽しさがありますね -- 12132841 (2013-10-10 08:43:52)


最終更新:2013年10月11日 19:54