【COBOL学習|豆知識】ベテランが教えるCOBOLの作法:算術演算における「定数(リテラル)」との付き合い方

1. 導入:なぜ定数(リテラル)の扱いが重要なのか

COBOLのプログラムを保守していると、演算処理の中に直接数値を書き込む「リテラル」を見かけることがよくあります。例えば、消費税率の計算やカウンターの加算などです。この書き方は非常に手軽ですが、書き方を間違えると計算精度の低下やプログラムの可読性の悪化を招きます。今回は、算術演算における定数使用の基本と、現場で好まれる「安全な作法」について解説します。

2. 基礎知識:リテラルとデータ定義

COBOLにおいて、プログラム内に直接記述する数値を「リテラル」と呼びます。参考本文にもある通り、COBOLのコンパイラは、このリテラルを内部的に「符号あり・小数点あり」の最大精度として扱います。
つまり、ADD 1 TO COUNTER と書いた場合、コンパイラは「1」という値を、その計算に適した内部形式へ自動的に変換して処理します。しかし、計算対象となるデータ項目(変数)の定義が不適切だと、この「自動変換」の過程で端数が切り捨てられたり、予期せぬオーバーフローが発生したりするリスクがあります。

3. 実装/解決策:定数の定義は「定数定義(88レベルや定数項目)」で行う

現場での鉄則は、「変更の可能性がある数値は、リテラルとして命令文に直書きせず、WORKING-STORAGE SECTIONで定義する」ことです。特に税率や割引率など、将来変更される可能性が高いものは、名前を付けて定義しておきましょう。

4. サンプルプログラム

以下は、リテラルを直接使う方法と、定数項目を定義して計算に利用する推奨される方法の比較です。

IDENTIFICATION DIVISION.
PROGRAM-ID. CALC-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
  • 推奨される定数定義(VALUE句で初期化)
01 WS-DISCOUNT-RATE PIC S9V99 VALUE 0.05. 01 WS-COUNTER PIC 9(04) VALUE 0. PROCEDURE DIVISION.
  • パターン1:リテラルを直接使う(単純な加算ならOK)
ADD 1 TO WS-COUNTER.
  • パターン2:定数項目を使う(メンテナンス性が高く、安全)
  • 割引率の計算など、変更の可能性があるものはこう書く
COMPUTE WS-COUNTER = WS-COUNTER - WS-DISCOUNT-RATE. DISPLAY "RESULT: " WS-COUNTER. STOP RUN.

5. 応用・注意点:現場で陥りやすいバグの回避策

最後に、注意点が2つあります。

1. データ項目のPIC指定を合わせる
計算結果を格納する変数のPIC句(桁数)が、計算結果の精度を保持できるか確認してください。例えば、小数を含む計算結果を整数型のPIC 9(4)に格納しようとすると、小数は切り捨てられます。

2. 計算の優先順位を意識する
COMPUTE文を使う場合、演算の順序によって精度が微妙に変わることがあります。複雑な式の場合は、括弧を適切に使い、どの段階で小数点以下の桁が処理されるのかを明確に意識しましょう。

「動けば良い」というコードから、「誰が見ても意図がわかり、変更に強い」コードへ。定数の扱い一つを見直すだけで、プログラムの品質はグッと向上しますよ。

コメント

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