レガシ四則算 |
除算 |
最終更新日:2006/04/17 |
●演算方式
仮数部の配列 / 配列、配列 /
Integer(Base未満)とがある。オペランドを調べて内部で自動的に選択される。Integerのオペランドであっても、値がBase(100000000)以上の場合もある
からである。商はPrecisionで指定された精度の桁数まで求められる。
●符号/結果の事前調整
- オペランドの符号にて結果の符合は調整される。
- 被除数が0の場合や、除数が1E±nや0の場合は、即結果が返される。
●配列 / Integer
この場合は、通常の除算命令で処理される。除算の場合は、上位から下位に演算する。また、仮数部の除算なので、例えば、123 / 89 などは、
12300000 / 89000000
なる除算になる。
以下の手順で行う。
- 結果の配列を指定された精度に従って用意し、初期化する。
- 最上位要素から、Bで整数除算する。商を結果に入れ、剰余をBase倍する。
- 前の剰余と次の要素値を加えたものをBで整数除算する。商を結果に入れ、剰余をBase倍する。これを、必要な精度になるまで繰り返す。
- 被除数の要素数を超えた状態で、剰余が0になった場合は、割り切れた状態なので終了する。
- 結果の配列を一つシフトダウンし、頭の要素を除去する。(結果の最上位要素 C(0) は、必ず、0 から 9 までの値となる。)
●配列 / 配列
最も時間のかかる処理となり、また、ネイティブな除算命令は使用できない。シフト&減算にて演算する。以下の手順で行う。
- オペランドA、Bを配列サイズの大きい方に合せる。
- 双方の配列を一つだけシフトダウンする。これは、初めから、A < B の場合でも、同じロジックが成立させるために必要な前処理である。
- 結果の配列を指定された精度に従って用意し、初期化する。
- 部分商を求める。ここでは、高速化を図っている。
- A (剰余)を一つシフトアップ(高速シフトアップ)し、部分商を求める。これを繰り返す。
- 剰余が0になった場合は、割り切れた状態なので終了する。この除算では、常に被除数の全体を扱っているので。
●正規化
除算の結果は以下のようになる。乗算の結果と同じように見えるが、頭に0が存在することがあるので、規格化の処理が異なる。
除算の結果
正規化は以下のように行う。
-
小数点は、当初、C0とC1の間にある。
-
頭から、初めて0でない桁を探す。その桁番号にて、指数を調整し、その桁を、最上位桁になるまでシフトアップする。
-
配列の後ろから要素が0のものを除去する。
-
有効な桁数を数える。
|