【COBOL学習|豆知識】COBOLの鉄則!DIVIDE文でゼロ除算を華麗にハンドリングする方法

導入

業務システムにおいて、計算処理は避けて通れません。特にDIVIDE文を用いた除算処理は、マスタデータや入力値の変動によって、予期せぬ「ゼロ除算」を引き起こすリスクを常に抱えています。実行時にゼロ除算が発生しプログラムが異常終了(アベンド)することは、夜間バッチやオンライン処理において致命的な欠陥となります。本稿では、堅牢なプログラムを記述するためのDIVIDE文の作法を解説します。

基礎知識

COBOLのDIVIDE文は、数値を割るための命令ですが、数学のルールと同様に「0で割る」ことは定義されていません。コンピュータの世界では、0で割ろうとするとCPUレベルで例外が発生し、COBOLランタイムがこれを検知してプログラムを停止させます。これを防ぐために用意されているのがON SIZE ERROR句です。これは計算結果が受け取り側の領域に収まらない場合や、ゼロ除算が発生した際に、異常終了を回避して特定の処理へ制御を移すための仕組みです。

実装/解決策

現場での実装においては、単にON SIZE ERRORを書くだけでなく、エラー発生時に「どの項目で問題が起きたか」をログに出力し、後続の処理を安全にスキップする設計が重要です。また、計算前に割る数が0でないかをIF文でチェックする「事前チェック」を組み合わせることで、より可読性の高いコードになります。

サンプルプログラム

以下のサンプルは、安全に除算を行うための標準的な実装パターンです。

IDENTIFICATION DIVISION.
PROGRAM-ID. DIVIDE-SAMPLE.

WORKING-STORAGE SECTION.
01 WS-VAL-A PIC 9(05) VALUE 100.
01 WS-VAL-B PIC 9(05) VALUE 0.
01 WS-RESULT PIC 9(05).

PROCEDURE DIVISION.
MAIN-PROCEDURE.

  • ゼロ除算の可能性がある場合は、事前にチェックを行うのが安全

IF WS-VAL-B = ZERO THEN
DISPLAY ‘警告: 割る数がゼロです。スキップします。’
ELSE

  • ON SIZE ERROR句で計算失敗を捕捉する

DIVIDE WS-VAL-A BY WS-VAL-B GIVING WS-RESULT
ON SIZE ERROR
DISPLAY ‘エラー: 除算中に桁あふれ、またはゼロ除算が発生’
NOT ON SIZE ERROR
DISPLAY ‘計算結果: ‘ WS-RESULT
END-DIVIDE
END-IF.

STOP RUN.

応用・注意点

現場でよくある失敗として、ON SIZE ERROR句を書き忘れるケースの他に、計算結果を格納する受け取り側(GIVING項目)の桁数が不足しているケースがあります。例えば、大きな数を小さな数で割った結果が、定義した桁数に入り切らない場合も、ゼロ除算と同様にON SIZE ERRORが発動します。
また、浮動小数点数(COMP-1/COMP-2)を扱う場合は、0に近い極小値(アンダーフロー)でもこの句が反応することがあります。データ型に応じた適切な桁数設計と、論理的なエラーハンドリングをセットで行うことが、ベテランのエンジニアとしての嗜みと言えるでしょう。

コメント

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