4 乗除算はどうするの?

ここで、賢明な諸君は、4則演算の残りの2つ、乗除算はどうしたのという疑問 が湧くはずである。湧いて欲しい。

最近のCPUは、これら乗除算のハードウェアーが実装されており、それに対応す る機械語命令がある。しかし、単純なCOMET IIには、そのハードウェアはなく、 当然機械語命令も無い。そのため、ソフトウェアーでその仕組みを実現させな くてはならない。詳細については、後で学習するが、ちょっとだけ方法を示す。 興味深い方法である。

4.1 乗算

4.1.1 算術加算を使う方法

例えば、10×3を計算する場合、10+10+10のように必要な回数だけ足し合わせ て乗算を行う。このように算術加算を用いて乗算を行うことができる。ただし、 この方法はもっとも原始的で効率の悪い方法である。人間がこの計算を行うの は非現実的であるが、単純作業を非常に高速で行うコンピューター向きの方法 である。

この例でもわかるように加算ができれば、乗算はできるのである。

4.1.2 ビットシフトを使う方法

もう少し効率の良い方法は、ビットシフトを使う方法である。これは、小学生 のときに学習をした筆算を用いた掛け算と同じである。たとえば、 $ 34\times24$を計算する場合、筆算は $ 34\times(2\times10^{1}+4\times10^{0})$と分解したはずである。そうして、 次の手順でこの除算を行ったはずである。
  1. $ 34\times2$を計算し、1桁ずらす(10倍する)。
  2. $ 34\times4$を計算する。
  3. 先の計算結果を合計する。この合計816が $ 34\times24$の計算結果である。

同じことを2進数で行う。これがコンピューターによる乗算である。先ほどと 同じ計算( $ 32\times24$)を行う。これを2進数で表現すると、

$\displaystyle (100010)_2\times(11000)_2=(100010)_2\times(1\times2^4+1\times2^3)$    

となる。これを先ほど同様の手順で計算する。
  1. 掛け算は1倍なので計算する必要が無く、最初に $ (100010)_2$を4桁左 にずらす(ビットシフト)。すると、 $ (1000100000)_2$となる。
  2. 次に $ (100010)_2$を3桁左にずらす。すると、 $ (100010000)_2$となる。
  3. 先の計算結果を合計すると、 $ (1100110000)_2$となる。これは、10進 数の816である。
ここでは、ビットシフトと加算命令を使った。これらの命令が用意されていれ ば乗算ができることがわかるであろう。実際、CASL IIにはビットシフトの命 令は用意されている。

4.2 除算

4.2.1 算術減算を使う方法

$ 10/3$の計算は10からから3を引いていきます。そして、負になったら計算は 完了です。すると、商と余りが分かります。算術減算を用いて乗除算が出来ま す。この例でもわかるように減算ができれば、除算はできるのである。 この方法は効率が悪いので、もう少しましな方法を考える。小学生の時に学習 した筆算のアルゴリズムを適用すれば効率は良くなる。計算は次のようにする。 計算の準備として、10と3を2進数で表す。

$\displaystyle (10)_{10}=(1010)_{2}\qquad\qquad(3)_{10}=(11)_2$    

次に示すように計算すれば、計算効率は上がるであろう。計算順序は、筆算で の割り算と同じである。

  1. $ (1)_2$から$ (11)_2$を減算したいが、負になるのでそれは不可とする。
  2. $ (10)_2$から$ (11)_2$を減算したいが、これも負になるので不可とす る。
  3. $ (101)_2$から$ (11)_2$を減算する。それは可能で、結果は$ (10)_2$で、 その桁に$ (1)_2$が立つ。
  4. 先ほどの残りと次の桁を合わせた$ (100)_2$は減算可能である。減算の 結果は$ (1)_2$で、その桁に$ (1)_2$が立つ。
  5. これ以上桁がないので、計算は完了である。商は $ (11)_2=(3)_{10}$余 りは $ (1)_2=(1)_{10}$となる。

4.2.2 ビットシフトを使う方法

直ちに、ビットシフトが適用できるのは、割る数が$ 2^n$になっている場合で ある。ただ、先ほどの筆算のアルゴリズムでもビットシフトは使ってはいる。

4.3 まとめ(乗除算)

ということで、加算と減算ができれば乗除算は可能である。さらに賢明な諸君 は、次の疑問が湧くはずである。湧いて欲しい。三角関数や指数関数などは、 どうやって計算しているのか?。三角関数や指数関数は、テイラー展開(マクロー リン展開)を使うと4則演算に分解できることを学習したはずである。したがっ て、4則演算ができれば、それらの関数は計算可能である。高級言語のコンパ イラーは、これらの関数を4則演算に変換して計算するようにしている。
ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成16年9月7日


no counter