| 
  
    | 四則演算方式 |  
    | 加算 |  
    | 最終更新日:2007/02/20 新規 |  ●概要  補数方式ではないので、負数があると面倒な処理が必要となる。全て絶対値演算になり、符号は別途調整される。加算といえど、減算になる場合もある。 ●全体  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 IntegerDim 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 要素 を除去する。有効な桁数を数える。 ○符号  符号を設定する。
 
 |