ホーム ] PC技術/システム技術 ] VB.NETプログラミング ] なるほどナレッジ ] インフォメーション ]

上へ
加減算
乗算
除算

レガシ四則算

除算

最終更新日:2006/04/17

●演算方式

 仮数部の配列 / 配列、配列 / Integer(Base未満)とがある。オペランドを調べて内部で自動的に選択される。Integerのオペランドであっても、値がBase(100000000)以上の場合もある からである。商はPrecisionで指定された精度の桁数まで求められる。

●符号/結果の事前調整

  • オペランドの符号にて結果の符合は調整される。
  • 被除数が0の場合や、除数が1E±nや0の場合は、即結果が返される。

●配列 / Integer

 この場合は、通常の除算命令で処理される。除算の場合は、上位から下位に演算する。また、仮数部の除算なので、例えば、123 / 89 などは、

12300000 / 89000000

なる除算になる。

以下の手順で行う。

  1. 結果の配列を指定された精度に従って用意し、初期化する。
  2. 最上位要素から、Bで整数除算する。商を結果に入れ、剰余をBase倍する。
  3. 前の剰余と次の要素値を加えたものをBで整数除算する。商を結果に入れ、剰余をBase倍する。これを、必要な精度になるまで繰り返す。
  4. 被除数の要素数を超えた状態で、剰余が0になった場合は、割り切れた状態なので終了する。
  5. 結果の配列を一つシフトダウンし、頭の要素を除去する。(結果の最上位要素 C(0) は、必ず、0 から 9 までの値となる。)

●配列 / 配列

 最も時間のかかる処理となり、また、ネイティブな除算命令は使用できない。シフト&減算にて演算する。以下の手順で行う。

  1. オペランドA、Bを配列サイズの大きい方に合せる。
  2. 双方の配列を一つだけシフトダウンする。これは、初めから、A < B の場合でも、同じロジックが成立させるために必要な前処理である。
  3. 結果の配列を指定された精度に従って用意し、初期化する。
  4. 部分商を求める。ここでは、高速化を図っている。
  5. A (剰余)を一つシフトアップ(高速シフトアップ)し、部分商を求める。これを繰り返す。
  6. 剰余が0になった場合は、割り切れた状態なので終了する。この除算では、常に被除数の全体を扱っているので。

 ●正規化

除算の結果は以下のようになる。乗算の結果と同じように見えるが、頭に0が存在することがあるので、規格化の処理が異なる。

除算の結果

 正規化は以下のように行う。

  1. 小数点は、当初、C0とC1の間にある。

  2. 頭から、初めて0でない桁を探す。その桁番号にて、指数を調整し、その桁を、最上位桁になるまでシフトアップする。

  3. 配列の後ろから要素が0のものを除去する。

  4. 有効な桁数を数える。