【COBOL学習|初心者向け】COBOLのMEAN関数で実現する「計算精度の罠」を回避する手法

導入:なぜ「平均」を自作してはいけないのか

COBOLで業務システムを開発していると、売上平均や単価計算といった「平均値」を求める場面によく遭遇します。初心者の頃は、自分で「合計金額 ÷ 件数」を計算するロジックを書きがちですが、これには大きな落とし穴があります。特に金融や原価計算のように、1円単位のズレが許されない現場では、自作のロジックは「計算誤差」の温床となります。今回は、COBOLの組込関数「MEAN」を活用して、浮動小数点の精度を維持し、計算誤差を最小限に抑える方法を解説します。

基礎知識:中間桁落ちとは何か

「中間桁落ち」とは、計算の途中で端数が切り捨てられたり、型の上限を超えて値が丸められたりすることで、最終結果に誤差が生じる現象です。
COBOLの計算では、定義したデータ型の精度(PIC句の桁数)に従って計算が行われます。例えば、合計値を算出した後にそのまま除算を行うと、除算の時点で意図しない桁落ちが発生し、本来の数値と数銭単位のズレが生じることがあります。MEAN関数は、内部的に高い精度で計算を保持して処理を行うため、この誤差を回避するのに非常に有効です。

実装:MEAN関数による精度の維持

MEAN関数は、引数として指定された数値の算術平均を求めます。自作のロジックでは「合計用変数の定義」と「除算の割り算用ルーチン」が必要ですが、MEAN関数を使えばこれらを一つの命令で完結できます。特に、計算の順序を意識せずに済むため、保守性の高いコードが書けるというメリットもあります。

サンプルプログラム

以下のコードは、MEAN関数を使用して平均値を求める例です。そのままコピーして、お手元のコンパイラで動作を確認してみてください。

IDENTIFICATION DIVISION.
PROGRAM-ID. MEAN-EXAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.

  • 精度を考慮し、計算結果は十分な桁数を確保します

01 VAL-1 PIC 9(5)V99 VALUE 12345.67.
01 VAL-2 PIC 9(5)V99 VALUE 23456.78.
01 VAL-3 PIC 9(5)V99 VALUE 34567.89.
01 RESULT-MEAN PIC 9(7)V999.

PROCEDURE DIVISION.
> MEAN関数を使用して平均を算出
> 内部で高精度に計算されるため、手動で加算・除算するより正確です
COMPUTE RESULT-MEAN = FUNCTION MEAN(VAL-1 VAL-2 VAL-3)

DISPLAY “平均値は: ” RESULT-MEAN.

STOP RUN.

応用・注意点:現場で役立つアドバイス

MEAN関数を使う際の注意点として、「引数に指定できる項目の型」を意識してください。基本的には数値項目であれば問題ありませんが、計算結果を格納する受け側の変数(上記の例ではRESULT-MEAN)の桁数が不足していると、せっかくの計算精度も意味をなさなくなります。

また、現場のルールで「特定の端数処理(切り捨て・四捨五入)を指定すること」と定められている場合は、MEAN関数の結果に対して改めてROUNDED句などを組み合わせる必要があります。計算の「精度」を担保するためにMEAN関数を使い、最終的な「表示形式」をROUNDEDで整える、という使い分けを覚えると、ベテランの仲間入りです。誤差の出ない堅牢な計算処理を目指しましょう。

コメント

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