1. 導入:なぜLOG10の引数チェックが重要なのか
COBOLの組込関数の中でも、数学的な計算を行うLOG10(常用対数)は、分析や統計処理で非常に便利です。しかし、この関数には「引数が0以下の場合はエラーになる」という数学的制約があります。もし正の数以外が渡されたままプログラムが進行すれば、実行時エラー(異常終了)を引き起こし、夜間バッチが停止するような重大なインシデントに繋がりかねません。今回は、堅牢なプログラムを書くための「ガード節」の考え方について解説します。
2. 基礎知識:LOG10と実行時エラー
LOG10関数は、指定された数値の常用対数を求める関数です。数学的に、対数関数は真数が0以下(0または負の数)の場合、値が定義されません。COBOLのランタイム環境でも、このルールに抵触するとプログラムは例外を発生させ、処理が中断されます。重要なのは、「計算が必要な時だけ計算する」という防御的なプログラミング(ガード節)を徹底することです。
3. 実装・解決策:ガード節による制御
解決策は極めて単純です。計算を実行する前に、IF文を用いて「引数が0より大きい(正数である)」ことを確実に判定します。これにより、予期せぬ数値が関数に渡されることを未然に防ぎ、エラーを回避することができます。
4. サンプルプログラム
以下のコードは、入力値が有効かを確認してからLOG10を適用する実用的なパターンです。
IDENTIFICATION DIVISION.
PROGRAM-ID. LOG-CHECK-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-INPUT-VAL PIC S9(09)V99.
01 WS-RESULT PIC S9(09)V9999.
01 WS-ERR-MSG PIC X(30) VALUE ‘エラー:0以下の値です’.
PROCEDURE DIVISION.
> 計算対象の数値を設定
MOVE 100 TO WS-INPUT-VAL.
> ガード節による判定:0より大きい場合のみ計算する
IF WS-INPUT-VAL > 0 THEN
COMPUTE WS-RESULT = FUNCTION LOG10(WS-INPUT-VAL)
DISPLAY ‘計算結果: ‘ WS-RESULT
ELSE
> 0以下の場合はエラー処理または代替処理を行う
DISPLAY WS-ERR-MSG
END-IF.
STOP RUN.
5. 応用・注意点:現場での陥りやすい罠
現場でよくある失敗は、入力値が「空白(スペース)」や「初期化漏れの0」であるケースです。特に、ファイルから読み込んだ数値フィールドや、再利用される作業領域には注意が必要です。
また、浮動小数点数(COMP-1/COMP-2)を扱う場合、微小な負の数が紛れ込むこともあります。厳密な計算が求められる場合は、判定条件を「WS-INPUT-VAL > 0」とするだけでなく、業務要件に応じて「WS-INPUT-VAL > 0.000000001」のように、許容誤差を考慮した判定を行うことも検討してください。常に「データは壊れているかもしれない」という前提でコードを書くことが、ベテランのエンジニアへの近道です。

コメント