第2回 実数表現とコンピュータの限界
前回の復習
345(16)を10進数にするには、
いちばん右を1の位、その左を16の位、次を16×16=256の位、として位取りする。
その後に、対応する係数と掛けて加える。すなわち、
345(16)=3×256+4×16+5×1=768+64+5=837(10)
1234(10)を16進数にするには、
1234÷16=77...2、77÷16=4...13、4÷16=0...4、より、4D2(16)を得る。
2.2進数と16進数
2進数の位取りは、小さいほうから、1、2、4、8、16、32、64、...と2倍になる。
位取りに対応する係数を掛けて加えるので、
1011010111 であれば、
512+0+128+64+0+16+0+4+2+1=727 がわかる。
係数が0の位取りは加えず、1になっているところだけ加えれば、対応する10進数が得られる。
この性質を使うと、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 を表現しています。
これは、
なので、16進数の「345.67」は、
になります。
【例題】10進数「345.67」を16進数に直すには
(解答)
通常通り、345÷16=21...9、21÷16=1...5、1÷16=0...1、となるので、最後から余りを並べて「159」を得る。
これは、どう考えればよいかというと、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.1は正しく表現できない!
10進数の「0.1」を上の方法で16進数に直すと、

となることが分かります。
これは、10進数の0.1を16進数で表すと、無限桁が必要になることを表しています。
コンピュータは電気信号のON(1)、OFF(0)だけで情報を表現するので、基本的に2進数しか扱えません。
10進数は2進数で表現されます。16進数1桁は2進数4桁ですから

となります。
これも無限桁です。パソコンで扱えるメモリは有限ですから、どこかの桁で切り落とされます。
このとき、表現誤差が生じてしまいます。
すなわち、コンピュータで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