# SUBTRACT文

説明書の該当箇所: 6.5.28 SUBTRACT文

  SUBTRACT文-書き方1.cob    SUBTRACT a FROM b             b から引く
  SUBTRACT文-書き方2.cob    SUBTRACT a FROM b GIVING c    結果を c に入れる
  SUBTRACT文-書き方3.cob    SUBTRACT CORRESPONDING        同じ名前の項目どうしを引く

すべて Standard 版で動きます。正しく動くと OK だけが並びます。

# 書き方1 と 書き方2 の違い

  SUBTRACT i FROM j.              j そのものが減る
  SUBTRACT i FROM j GIVING k.     j は変わらず、k に結果が入る

ADD文 の書き方1・書き方2 と同じ関係です。
FROM の後ろの項目が読むだけになるかどうかが違います。

# 引く数も入れ先も複数書けます

  SUBTRACT i j FROM k m.

i と j の合計を、k と m のそれぞれから引きます。
200 と 300 から (3 + 100) を引いて、97 と 197 になります。

# ★ ROUNDED は付けた項目にだけ効きます

ここが書き方1 のいちばんの読みどころです。

  SUBTRACT 9v99-1 9v99-2 FROM s9v9-1 ROUNDED s9v9-2.

1.0 から 0.31 を2回引くと 0.38 ですが、入れ先は PIC S9V9 で
小数1桁しか持てません。結果はこうなります。

  s9v9-1  ROUNDED が付いている   → 0.4
  s9v9-2  付いていない           → 0.3

同じ文の中でも、ROUNDED は直前の項目にしか掛かりません。
引く数を 0.33 にした場合(1.0 - 0.66 = 0.34)は、丸めても 0.3 のままです。
この2つを並べてあるので、違いが出る境目が分かります。

ON SIZE ERROR も ADD文 と同じように確かめています。

# 書き方3(CORRESPONDING)について

集団項目 X と Y の中で、同じ名前を持つ項目どうしだけが引かれます。

  SUBTRACT CORR X FROM Y.

結果は " 090802" になります。1桁ずつ対応させて、
どの項目が引かれ、どの項目がそのまま残ったかを読み取ってください。
名前の無い項目(FILLER)や REDEFINES した項目の扱いは
MOVE CORRESPONDING と同じです。

# 関連

  6_5_2_ADD文\ADD文-書き方3.cob        ADD CORRESPONDING
  6_5_19_MOVE文\MOVE_CORR文.cob        MOVE CORRESPONDING
