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

上へ
加減算
乗算
除算

レガシー四則算

乗算

最終更新日:2006/03/20

●演算方式

  仮数部の配列 * 配列または、配列 * Integer(Base未満)とがある。オペランドを調べて内部で自動的に選択される。Integerのオペランドであっても、値がBase(100000000)以上の場合もある。

●符号/結果の事前調整

  • 乗算は絶対値であるが、オペランドの符号に合せて正しく調整される。
  • どちらかが、0の場合や、1E±nの場合は、演算しないで即結果を返す。

●要素乗算(部分積)

 乗算の基本となるもの。仮数部配列とIntegerの乗算になるが、仮数部なので、例えば、123 * 89 は、

 12300000 * 89000000

と言う乗算となる。これを繰り返しているだけである。要素乗算の結果は、Long配列にし、要素間の桁上げは行わない。これは、少しでも速度を稼ぐためである。下図参照。桁上げは、別途必要に応じて行う。

以下の手順で行う。

  • 結果のLong配列を初期化する。
  • Bが0のときは即終了。
  • A(i) = 0 の時は、その乗算はパス。

●配列 * Integer

 結果の配列サイズは、オペランド配列サイズ+1 となる。上記の部分積のLong配列を、最終結果のInteger配列に変換する。下位の要素から、値がBase未満部分をInteger配列の値とし、Baseを超える部分を上位に桁上げする。これを繰り返す。

●配列 * 配列

部分積を繰り返し、部分積結果を直前の部分積結果と加算しながら桁上げ処理を行う。桁上げは都度しないと、Longでもオーバーフローしてしまうことがある。Longより長い数値型があれば、もっと高速になるが。残念ながら、DecimalはBCDなので遅くて利用できない。

以下のようにして演算する

  • 結果配列を初期化する。サイズはオペランド配列サイズの合計。
  • 部分積をLong配列で求める
  • Long配列と結果配列を加算しながら桁上げを行う。
  • 一つづらして同じことを行う。これを繰り返す。

●正規化

乗算の結果は以下のようになる。

乗算結果の配列

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

  1. 小数点は、C1とC2の間にある。

  2. C0が、0のときは、指数は不変にし、全体を一つシフトアップする。1以上のときは、指数を+1にする。

  3. 配列サイズを制限以内に調整する。

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

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