【COBOL学習|実務向け】COBOL実務の鉄則:MULTIPLY文の使い分けと精度管理の勘所

導入:なぜ今MULTIPLY文を見直すのか

COBOLでの数値計算は、一見単純なようでいて、実は「桁あふれ」や「計算精度」という落とし穴が潜んでいます。特にMULTIPLY文は、旧来の記述方式(BYのみ)と、現代的な記述方式(GIVINGあり)で挙動が大きく異なります。本稿では、現場でバグを生まないための正しいMULTIPLY文の作法について解説します。

基礎知識:MULTIPLY文の仕組み

MULTIPLY文には大きく分けて2つの構文があります。
1. MULTIPLY A BY B.
AとBを掛け算し、結果をBに格納します。Bの値は上書きされるため、元の値を保持したい場合には不向きです。
2. MULTIPLY A BY B GIVING C.
AとBを掛け算し、結果をCに格納します。AとBの値は維持され、計算結果だけを別の領域へ格納できます。

実務では、元データを保護し、計算結果のみを制御できる後者の「GIVING」形式を推奨します。

実装と解決策:計算精度を担保する

単に掛け算を行うだけでなく、計算結果を格納するデータ項目の「定義(PICTURE句)」が重要です。特に小数点を含む計算や、桁数が大きい計算では、中間結果が切り捨てられないよう、十分な桁数を確保したワークエリアを用意する必要があります。

サンプルプログラム

以下は、実務でよく利用される「単価×数量」の計算を安全に行うサンプルです。

IDENTIFICATION DIVISION.
PROGRAM-ID. CALC-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.

  • 数値定義:計算精度を考慮して十分な桁数を確保

01 WS-TANKA PIC S9(05)V99 VALUE 1500.50.
01 WS-SURYO PIC S9(04) VALUE 10.
01 WS-TOTAL-AMT PIC S9(09)V99 VALUE ZERO.

PROCEDURE DIVISION.
MAIN-LOGIC.

  • MULTIPLY文の実行
  • BYの後の項目がGIVINGの対象項目に結果を反映させる

MULTIPLY WS-TANKA BY WS-SURYO GIVING WS-TOTAL-AMT.

  • 計算結果の表示

DISPLAY “合計金額: ” WS-TOTAL-AMT.

STOP RUN.

応用・注意点:現場で陥りやすい罠

1. 桁あふれ(SIZE ERROR)への対応
計算結果が受け取り側のPICTURE句の桁数を超えると、上位桁が欠落します。必ず「ON SIZE ERROR」句を付加し、異常時の処理(エラーログ出力やフラグ立て)を実装する癖をつけましょう。
例:MULTIPLY A BY B GIVING C ON SIZE ERROR PERFORM ERROR-ROUTINE.

2. 計算結果の丸め(ROUNDED)
小数を含む計算で、端数を四捨五入したい場合は「ROUNDED」句を忘れないでください。これがないと、COBOLはデフォルトで切り捨てを行います。

3. データ型の不一致
異なる属性(パック10進数とゾーン10進数など)の混在は、性能低下や予期せぬ挙動を招きます。計算に関わる項目は、可能な限り属性を統一して定義するのがベテランの作法です。

コメント

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