導入
COBOL開発において、最も頻繁に使用する「IF文」。その条件式で数値同士を比較する際、データ定義が異なっていても「正しく判定されるから大丈夫」と深く考えずに実装していないでしょうか。実は、この比較規則を正しく理解していないと、意図しないバグや、将来的な保守フェーズでの思わぬ落とし穴に繋がります。今回は、数値比較の「論理的判定」の仕組みを紐解きます。
基礎知識
COBOLにおける数値比較では、比較されるデータ項目のUSAGE(内部表現)やPICTURE句の桁数が異なっていても、コンパイラが自動的に値を正規化して比較を行います。
具体的には、以下の処理が内部で行われます。
1.小数点の位置合わせ:小数点(V)の位置を基準に、両方の値を整列させます。
2.値の論理比較:内部表現(DISPLAY形式やCOMP-3形式など)にかかわらず、数学的な「数値」として比較します。
3.符号の処理:符号(S)付き項目であれば、正負の概念を正しく認識し、例えば「-5」と「+3」であれば「-5 < +3」と判定します。
実装/解決策
比較を行う際は、異なる属性同士であっても「数値」であれば基本的にはそのまま比較して問題ありません。ただし、非数値(英数字)が混在している場合は比較結果が期待と異なる可能性があるため、必ず数値項目同士であることを確認することが重要です。
サンプルプログラム
以下のコードは、USAGEの異なる数値項目を比較する例です。コピーして動作確認にご活用ください。
IDENTIFICATION DIVISION.
PROGRAM-ID. NUM-COMPARE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 表示形式(DISPLAY)の数値
01 WS-DISPLAY-VAL PIC S9(3) VALUE -50.
- 圧縮形式(COMP-3)の数値(小数点あり)
01 WS-COMP3-VAL PIC S99V99 VALUE 12.34.
PROCEDURE DIVISION.
- 数値比較の実施
- 内部表現が異なっていても、数学的に比較される
IF WS-DISPLAY-VAL < WS-COMP3-VAL THEN DISPLAY "比較結果: WS-DISPLAY-VALの方が小さいです。" ELSE DISPLAY "比較結果: WS-DISPLAY-VALの方が大きいか等しいです。" END-IF.
- 符号付き数値の比較確認
IF WS-DISPLAY-VAL < 0 THEN DISPLAY "WS-DISPLAY-VALは負の数です。" END-IF. STOP RUN.
応用・注意点
現場で注意すべきポイントが2つあります。
1.性能面での考慮:
比較のたびに内部的な変換処理が走るため、極めて厳密なループ処理内では、可能な限り属性(USAGEやPICTURE)を統一しておく方が、わずかではありますが実行効率が良くなります。
2.非数値データによる異常終了:
数値項目として定義していても、誤って英数字などの非数値データが混入している場合、比較処理や演算でデータ例外(S0C7等)が発生することがあります。入力インターフェースや他システムからのデータ連携部分では、必ずNUMERICチェック(IF 変数 IS NUMERIC)を行ってから比較する癖をつけましょう。
この「数値比較の自動変換」はCOBOLの強力な武器ですが、過信せず、常にデータの健全性を意識したコーディングを心がけてください。

コメント