Subsections

7 付録

7.1 乗除算はどうするの?

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

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

7.1.1 乗算

7.1.1.1 算術加算を使う方法

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

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

7.1.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にはビットシフトの命令は用意されている.

7.1.2 除算

7.1.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}$ となる.

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

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

7.1.3 まとめ(乗除算)

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


no counter