【COBOL学習|豆知識】COBOLの条件式:数値比較における「暗黙のルール」を再確認する

導入

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の強力な武器ですが、過信せず、常にデータの健全性を意識したコーディングを心がけてください。

コメント

タイトルとURLをコピーしました