導入: なぜ算術演算とMOVE命令の共通理解が重要か
COBOLの現場では、ADDやCOMPUTEといった演算命令の結果が、意図した値と微妙に異なるというトラブルが発生することがあります。これは、多くのプログラマが「計算結果」ばかりに目を向け、「受け側のデータ項目への格納ルール」を軽視しがちなことが原因です。実は、COBOLの算術演算は、その最終段階でMOVE命令と全く同じ「小数点位置合わせ」と「桁落ちルール」が適用されます。この仕組みを正しく理解することは、バグのない堅牢な基幹システムを構築するための第一歩です。
基礎知識: 計算と格納の二段階プロセス
COBOLの算術命令(ADD, SUBTRACT, MULTIPLY, DIVIDEなど)は、内部的に以下の二段階で処理されています。
1. 一時作業領域(中間結果)での計算:命令の種類やデータ型に応じた精度で計算が行われます。
2. 受け側(ターゲット)への格納:結果をターゲットのPICTURE句に合わせて変換します。
ここで重要になるのが「小数点位置合わせ」です。例えば、小数を持つ数値を整数型の項目に格納する場合、MOVE命令と同様に小数が切り捨てられます。また、桁数オーバー時には、左側の有効数字が失われる(桁落ち)リスクがあります。
実装/解決策: 精度を意識した記述
計算精度を維持するためには、演算結果を受け取る項目(ターゲット)の定義を、演算の最大値と小数桁数に対して十分な余裕を持って設計する必要があります。特に中間演算を行う場合には、計算用の作業領域(WORKING-STORAGE SECTION)を、ソース項目よりも広めに定義するのが現場の鉄則です。
サンプルプログラム: 算術演算と転記ルールの挙動確認
以下のコードは、算術演算がMOVE命令と同じルールで切り捨てや編集を行うことを示しています。
IDENTIFICATION DIVISION. PROGRAM-ID. CALC-RULE-TEST. DATA DIVISION. WORKING-STORAGE SECTION.
- 計算元データ
- 受け側データ(小数点以下は切り捨てられる)
- 受け側データ(桁数が足りない)
- 1. 小数点位置合わせの挙動
- 123.45 + 10.50 = 133.95 となるが、格納先が整数のみのため「133」になる
- 2. 桁落ちの挙動
- 計算結果は133.95だが、WS-RESULT-SMLは1桁のため、左側の数値が失われる
応用・注意点: 現場で役立つ補足
現場で最も陥りやすいのは、「COMPUTE命令を使えば自動的に精度が保たれる」という誤解です。COMPUTE命令であっても、結果を代入するデータ項目の定義が不足していれば、MOVE命令と同様の切り捨て・桁落ちが発生します。
回避策のポイント:
1. 計算用中間フィールド(W-WORK-CALCなど)は、常に最大値を見越したPIC句を定義する。
2. 最終出力項目への転記時に、必要に応じてROUNDED句を使用し、四捨五入の制御を明示する。
3. 特に金額計算などでは、計算の途中で切り捨てが発生しないよう、可能な限り下位桁まで保持した状態で計算を進め、最後に編集用項目へMOVEする設計を徹底する。
これらの作法を守ることで、予期せぬ数値の不一致を防ぎ、保守性の高いプログラムを維持することが可能です。

コメント