導入:なぜ今、ABS関数なのか
業務システム、特に勘定系や統計処理において「二つの数値の差分」を求めることは頻繁にあります。「AとBの差を求め、それを加算する」といった際、従来はIF文を使って「AがB以上ならA-B、そうでなければB-A」という条件分岐を書いていませんでしたか?この手法はコードの行数を増やすだけでなく、メンテナンス時にロジックのミスを招く原因にもなります。今回解説するABS関数(絶対値関数)を使いこなせば、それらの煩雑な条件分岐を一行で解決でき、可読性の高いスッキリとしたコードが書けるようになります。
基礎知識:ABS関数とは
ABS関数は、COBOLの組込関数の一つで、引数として指定した数値の「絶対値(符号を除いた値)」を返します。数学的に言えば、正の数であればそのままの値を、負の数であれば符号を反転させた正の値を返します。COBOLの組込関数は、FUNCTION キーワードを付けて呼び出すのが基本です。
実装:ABS関数の活用手順
実装は非常にシンプルです。COMPUTE命令の中で FUNCTION ABS(式) と記述するだけです。特筆すべきは、引数の中に演算式を直接組み込める点です。これにより、一時変数を用意することなく、計算結果に対して即座に絶対値処理を適用できます。
サンプルプログラム
以下のコードは、二つの売上データの差分を求め、その絶対値を計算する実用的な例です。そのままコピーしてコンパイルのテストにご利用ください。
IDENTIFICATION DIVISION.
PROGRAM-ID. ABS-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-VAL-1 PIC S9(7) VALUE 1000.
01 WS-VAL-2 PIC S9(7) VALUE 1500.
01 WS-DIFF-VAL PIC S9(7).
PROCEDURE DIVISION.
> 1000 – 1500 = -500 となるが、ABS関数により 500 が返る
COMPUTE WS-DIFF-VAL = FUNCTION ABS(WS-VAL-1 – WS-VAL-2).
DISPLAY “差分の絶対値は: ” WS-DIFF-VAL.
GOBACK.
応用・注意点:現場での落とし穴
現場で活用する上で、以下の二点に注意してください。
1. 演算結果の桁あふれ(オーバーフロー):
ABS関数の引数内で計算を行う際、結果が受け取り側のデータ項目の桁数を超えないよう注意してください。特に引き算の後に絶対値を取る場合、一時的に値が大きくなるケースがないか、定義を見直しましょう。
2. 符号付きデータ項目の定義:
ABS関数の戻り値は符号を含んだ形式になることが多いため、受け取り側の項目(WS-DIFF-VALなど)は、必ず PIC S9(n) のように符号付きで定義してください。符号なし(PIC 9(n))で定義すると、予期せぬ数値変換エラーや、意図しない値が格納されるリスクがあります。
IF文による分岐を減らすことは、テストケースの削減にも繋がります。ぜひ積極的に活用してください。

コメント