Subsections
ここで,賢明な諸君は,4則演算の残りの2つ,乗除算はどうしたのという疑問が湧くはず
である.湧いて欲しい.
最近のCPUは,これら乗除算のハードウェアーが実装されており,それに対応する機械語
命令がある.しかし,単純なCOMET IIには,そのハードウェアはなく,当然機械語命令も
無い.そのため,ソフトウェアーでその仕組みを実現させなくてはならない.詳細につい
ては,後で学習するが,ちょっとだけ方法を示す.興味深い方法である.
例えば,
を計算する場合,
のように必要な回数だけ足し合わせて
乗算を行う.このように算術加算を用いて乗算を行うことができる.ただし,この方法は
もっとも原始的で効率の悪い方法である.人間がこの計算を行うのは非現実的であるが,
単純作業を非常に高速で行うコンピューター向きの方法である.
この例でもわかるように加算ができれば,乗算はできるのである.
もう少し効率の良い方法は,ビットシフトを使う方法である.これは,小学生のときに学
習をした筆算を用いた掛け算と同じである.たとえば,
を計算する場合,筆
算は
と分解したはずである.そうして,次の
手順でこの除算を行ったはずである.
-
を計算し,1桁ずらす(10倍する).
-
を計算する.
- 先の計算結果を合計する.この合計816が
の計算結果である.
同じことを2進数で行う.これがコンピューターによる乗算である.先ほどと
同じ計算(
)を行う.これを2進数で表現すると,
となる.これを先ほど同様の手順で計算する.
- 掛け算は1倍なので計算する必要が無く,最初に
を4桁左
にずらす(ビットシフト).すると,
となる.
- 次に
を3桁左にずらす.すると,
となる.
- 先の計算結果を合計すると,
となる.これは,10進
数の816である.
ここでは,ビットシフトと加算命令を使った.これらの命令が用意されていれば乗算がで
きることがわかるであろう.実際,CASL IIにはビットシフトの命令は用意されている.
の計算は10からから3を引いていきます.そして,負になったら計算は完了です.
すると,商と余りが分かります.算術減算を用いて乗除算が出来ます.この例でもわかる
ように減算ができれば,除算はできるのである.
この方法は効率が悪いので,もう少しましな方法を考える.小学生の時に学習した筆算の
アルゴリズムを適用すれば効率は良くなる.計算は次のようにする.計算の準備として,
10と3を2進数で表す.
次に示すように計算すれば,計算効率は上がるであろう.計算順序は,筆算での割り算と
同じである.
-
から
を減算したいが,負になるのでそれは不可とする.
-
から
を減算したいが,これも負になるので不可とす
る.
-
から
を減算する.それは可能で,結果は
で,
その桁に
が立つ.
- 先ほどの残りと次の桁を合わせた
は減算可能である.減算の
結果は
で,その桁に
が立つ.
- これ以上桁がないので,計算は完了である.商は
余
りは
となる.
直ちに,ビットシフトが適用できるのは,割る数が
になっている場合である.ただ,
先ほどの筆算のアルゴリズムでもビットシフトは使ってはいる.
ということで,加算と減算ができれば乗除算は可能である.さらに賢明な諸君は,次の疑
問が湧くはずである.湧いて欲しい.三角関数や指数関数などは,どうやって計算してい
るのか?.三角関数や指数関数は,テイラー展開(マクローリン展開)を使うと四則演算に
分解できることを学習したはずである.したがって,四則演算ができれば,それらの関数
は計算可能である.高級言語のコンパイラーは,これらの関数を4則演算に変換して計算
するようにしている.
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
2006-01-22