ホーム ] 関係演算方式 ] 四則演算方式 ]

上へ
加算
減算
乗算
除算

四則演算方式

加算

最終更新日:2007/04/26 新規

●概要

 補数方式ではないので、負数があると面倒な処理が必要となる。全て絶対値演算になり、符号は別途調整される。加算といえど、減算になる場合もある。

●全体

 C = A + B なる演算では、

  1. 符号の組合せによって演算を決定する。
  2. 符号は別途決定する。
  3. 加減算は同じ指数同士でないと演算できないので指数を合わせる。これは指数の小さい方が大きい方に合わせ、桁移動する。結果の指数は大きい方で決まる。
  4. 演算する。
  5. 結果を正規化する。

●演算前処理

○符号検査

  1. 少なくともどちらかが、Overflow、NaN であれば、結果は、結果は Zero とする。
  2. 双方が、Zero であれば、結果も、Zero。
  3. 片方がZero であれば、もう一方の値を結果とする。
  4. Positive、Negative などであれば、次の処理へ。

○符号と大小関係

 a、b をそれぞれの絶対値とすれば、下表のようになる。

  B
+ -
A + a + b a - b
- -a + b = b - a -a - b = -(a + b)
  • 同符号の場合は、上表の黄色背景のように加算で良く、結果の符号も決まる。
  • 異符号の場合は、減算となる。減算は、絶対値の大小により下表のように演算方式が決まる。同値であれば、結果を Zero とする。
  a > b のとき a < b のとき
a - b a - b を行い、符号は + b - a を行い、符号は -

○桁合せ/配列合せ

 指数部が異なる場合は、一時的に指数部の小さい方を非正規化状態にし、指数を大きい方に合せる。移動桁数は差分となる。例えば、

 1.2345(10) + 5.67(8)

では、指数がことなるので、小さい方を差分 2 だけ、右シフトする。つまり、0.0567(10) にする。これにて、

 1.2345(10) + 0.0567(10)

は、仮数部の単純加算で行える。

 また、両者の配列数が異なる場合は、大きい方に合せておく。

●演算

○加算

 加算は到って簡単である。配列の要素同士をInteger として以下のように加算する。

Integer配列 A() + B() → C() なる加算

Dim i, L As Integer
Dim W, CU As Integer
L = A.Length
ReDim C(L)
CU = 0
For i = L - 1 To 0 Step -1  '後ろから演算
   W = A(i) + B(i) + CU
   If W >= Base Then            '基数超過なので、キャリーを立てる
      C(i + 1) = W - Base
      CU = 1
   Else
      C(i + 1) = W
      CU = 0
   End If
Next
C(0) = CU           '最上位からのキャリー

加算値は全多として桁上がりがある可能性があるので、前に一つ余計に配列を追加しておく(下図、赤枠)。従って、小数点は、二つ目の配列の直前にあるとする。

○減算

 (減算を参照方。)

●後処理

○正規化

 C(0) が 0 でなければ、全体として桁上がりがあったので、C() を右に一つシフトし、指数調整値を +1 にする。C(0) を除去する。加算なので、これ以上頭に 0 要素はない。後ろの、0 要素 を除去する。有効な桁数を数える。

○符号

 符号を設定する。