導入:なぜ今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進数など)の混在は、性能低下や予期せぬ挙動を招きます。計算に関わる項目は、可能な限り属性を統一して定義するのがベテランの作法です。

コメント