|
四則演算方式 |
|
加算 |
| 最終更新日:2006/11/29 新規 |
●概要
補数方式ではないので、負数があると面倒な処理が必要となる。全て絶対値演算になり、符号は別途調整される。加算といえど、減算になる場合もある。
●全体
C = A + B なる演算では、
- 符号の組合せによって演算を決定する。
- 符号は別途決定する。
- 加減算は同じ指数同士でないと演算できないので指数を合わせる。これは指数の小さい方が大きい方に合わせ、桁移動する。結果の指数は大きい方で決まる。
- 演算する。
- 結果を正規化する。
●演算前処理
○符号検査
- 少なくともどちらかが、Overflow、NaN であれば、結果は、結果は Zero とする。
- 双方が、Zero であれば、結果も、Zero。
- 片方がZero であれば、もう一方の値を結果とする。
- 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 要素 を除去する。有効な桁数を数える。
○符号
符号を設定する。
|