演算の仕組みとコンピュータの限界
Computation & Limitsコンピュータは、命令された通りに忠実に動きます。しかし、その「命令」や「数値の扱い方」自体に限界があるため、コンピュータが常に絶対的な正解を導き出せるとは限りません。このレッスンでは、コンピュータがどう計算しているか、そしてその計算にどんな限界があるかを見ていきます。
CPUは「足し算」の組み合わせだけで動いている
コンピュータのCPUは、「足し算」の組み合わせだけで動いています。引き算は負の数の足し算、掛け算は足し算の繰り返し、割り算は引き算の繰り返しとして実現されています。複雑に見える計算も、根っこをたどれば足し算にたどり着くのです。
論理回路と論理演算
この計算を、ON(1)とOFF(0)の電気信号で制御するしくみが論理回路です。0と1の値だけで行う計算を論理演算と呼びます。基本となる回路は次の3つです。
| 回路 | 別名 | ふるまい |
|---|---|---|
| AND回路 | 論理積 | すべて1のときだけ、出力が1になる |
| OR回路 | 論理和 | どれか1つでも1なら、出力が1になる |
| NOT回路 | 論理否定 | 信号を反転する(1なら0に、0なら1に) |
これらの回路を組み合わせた「加算器」で2進数の足し算を行い、そこからさらに複雑な計算を実現しています。私たちが普段目にしている複雑な処理も、たどっていけば、この単純な0と1の組み合わせに行き着きます。
コンピュータも間違える
コンピュータは完璧ではありません。無限の小数を扱えないことによる丸め誤差、保存できる最大値を超えたときに起こるオーバーフロー、バグや故障などによって、間違いが生じることがあります。コンピュータは命令には忠実ですが、その命令や数値の扱い方自体に限界があるためです。
たとえば、1÷3は0.333333…と無限に続く数です。本当は終わりがありません。しかしコンピュータは、保存できる桁数(ビット数)が決まっているため、途中で区切って保存します。仮に0.3333までしか保存できないとしましょう。すると3倍しても0.9999になり、1にはなりません。これは計算が間違っているのではなく、途中で丸めているために生まれる誤差です。
ただし、コンピュータは十進数ではなく二進数で数を保存しています。すると、4.3や4.4のような一見きりのよい数も、実は完全にぴったりとは表せず、少しだけズレた近い値として保存されます。そのため4.3-4.4を計算すると、本当は-0.1になるはずなのに、-0.0999999…のような結果が出ることがあります。
つまりポイントは、「コンピュータが間違えているのではなく、有限の桁数で近い値を保存しているために誤差が出る」ということです。
ここからは、基礎の一歩先の話です。初心者の方は読み飛ばして構いません。でも、Excelで小数の計算をしていて「あれ?」と思った経験がある方ほど「そうだったのか」となる話です。
Excelでも同じことが起きる
表計算ソフトで小数を含む計算をしていると、理論上はぴったり0になるはずの引き算の結果が、ごくわずかにずれた数値で表示されることがあります。これも、ここで説明した丸め誤差と同じ原理です。コンピュータが壊れているわけではなく、二進数で近い値を保存しているために起きる、ごく自然な現象です。
オーバーフローが引き起こした実例
オーバーフロー(保存できる桁数の上限を超えてしまうこと)は、過去に実際のシステム障害の原因になったことがあります。保存できる数値の範囲を甘く見積もってプログラムを設計すると、想定外に大きな数値が入力されたときに、システム全体が誤作動を起こすことがあるのです。「有限の桁数しか扱えない」というコンピュータの限界を意識しておくことは、単なる豆知識ではなく、システムを設計・利用するうえで実務的にも大切な視点です。
教室のひとこま
最後に、このテーマを教えるとき、教室でよく交わされるやりとりを。
講師論理回路の話は、社会人研修では退屈になりがちなテーマです。「CPUの中身は、実は足し算しかしていない」という一言を最初に置くと、そこから先の話に興味を持ってもらいやすくなります。