COBOLの数値演算で桁あふれを防ぐ!初心者でもわかるサイズエラー対策
生徒
「先生、COBOLで数の計算をするときに“桁あふれ”って起きることがあるんですか?」
先生
「はい、起きます。たとえば、変数のサイズより大きな数を計算すると、エラーや正しくない結果になることがあるんです。」
生徒
「それって危険ですね……。どうやって防げばいいんでしょうか?」
先生
「いい質問ですね。今日は、COBOLで数値演算をするときに気をつける“桁あふれ(オーバーフロー)”と“サイズエラー”の回避方法を学びましょう。」
1. 桁あふれ(オーバーフロー)とは?
桁あふれ(けたあふれ)とは、計算結果が変数のサイズを超えてしまうことです。たとえば、99までしか入らない変数に100を入れようとした場合に起こります。
COBOLでは、変数の大きさはPIC(ピクチャ)句で決まります。たとえば、次のように定義します。
01 TOTAL-AMOUNT PIC 9(2) VALUE 99.
この場合、TOTAL-AMOUNTは2桁までの数字しか入れられません。もし100を代入しようとすると、値が入りきらず桁あふれになります。
2. SIZE ERRORとは?
SIZE ERRORとは、COBOLで演算をした結果が変数の定義サイズを超えたときに発生するエラーです。これは、コンピュータが「値が大きすぎて入らない!」という状態を検出したことを意味します。
たとえば、次のような例を見てみましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. SIZE-ERROR-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NUM-A PIC 9(2) VALUE 50.
01 NUM-B PIC 9(2) VALUE 60.
01 RESULT PIC 9(2).
PROCEDURE DIVISION.
ADD NUM-A TO NUM-B GIVING RESULT
ON SIZE ERROR
DISPLAY "サイズエラー発生!計算結果が大きすぎます。"
NOT ON SIZE ERROR
DISPLAY "計算結果:" RESULT
END-ADD.
STOP RUN.
サイズエラー発生!計算結果が大きすぎます。
この例では、50+60=110ですが、結果を入れるRESULTは2桁しかないため、SIZE ERRORが発生します。
ON SIZE ERROR句を使うことで、桁あふれが起きたときの処理を安全に制御できます。
3. 桁あふれを防ぐ3つのポイント
桁あふれを防ぐには、COBOLのデータ定義と演算方法に注意が必要です。ここでは3つの具体的な対策を紹介します。
① PIC句の桁数を余裕を持って設定する
計算で大きな数になる可能性がある場合は、変数の桁数を多めに設定しておきましょう。たとえば、2桁の数字を足し算するなら、結果を入れる変数は3桁にしておくと安全です。
01 NUM-A PIC 9(2) VALUE 50.
01 NUM-B PIC 9(2) VALUE 60.
01 RESULT PIC 9(3).
このように定義すると、50+60=110が問題なく入ります。システム開発では、将来的に数値が増える可能性を考えて、少し多めに桁を確保するのが一般的です。
② ON SIZE ERROR句で安全な処理を行う
演算命令(ADD、SUBTRACT、MULTIPLY、DIVIDEなど)には、ON SIZE ERRORをつけることで、エラー発生時の処理を明示的に書けます。
これにより、計算が失敗してもプログラムが止まることなく、安全にエラーメッセージを表示したり、代替の処理を実行したりできます。
③ NOT ON SIZE ERROR句を併用する
NOT ON SIZE ERRORを使えば、正常に計算できた場合の処理も明確に分けられます。これにより、エラーの有無に関係なく、正確な動作が保証されます。
4. さまざまな演算でのサイズエラー例
COBOLでは、加算(ADD)だけでなく、引き算(SUBTRACT)、掛け算(MULTIPLY)、割り算(DIVIDE)でもサイズエラーが起こります。ここではそれぞれの例を紹介します。
● SUBTRACT(引き算)での例
SUBTRACT 200 FROM 50 GIVING RESULT
ON SIZE ERROR DISPLAY "サイズエラー:結果がマイナスになりました。".
この場合、結果は「-150」になりますが、もしRESULTがPIC 9(3)(符号なし)だとマイナスを扱えないため、サイズエラーになります。
● MULTIPLY(掛け算)での例
MULTIPLY 99 BY 99 GIVING RESULT
ON SIZE ERROR DISPLAY "サイズエラー:掛け算の結果が大きすぎます。".
結果は9801になります。もしRESULTがPIC 9(3)だと4桁の数値を格納できず、サイズエラーになります。
● DIVIDE(割り算)での例
DIVIDE 100 BY 0 GIVING RESULT
ON SIZE ERROR DISPLAY "ゼロで割り算はできません!".
割り算で「0」で割るとエラーになります。COBOLはこのような危険な計算もON SIZE ERRORで防ぐことができます。
5. 実務で使える安全な数値演算の書き方
実際の業務システムでは、金額や数量などの数値を扱うとき、桁あふれを防ぐ工夫が欠かせません。以下は、安全な書き方の例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAFE-MATH.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PRICE PIC 9(6)V99 VALUE 999999.99.
01 TAX-RATE PIC 9V99 VALUE 1.10.
01 TOTAL PIC 9(7)V99 VALUE 0.
PROCEDURE DIVISION.
MULTIPLY PRICE BY TAX-RATE GIVING TOTAL
ON SIZE ERROR
DISPLAY "サイズエラー:金額が大きすぎます。"
NOT ON SIZE ERROR
DISPLAY "税込金額:" TOTAL
END-MULTIPLY.
STOP RUN.
税込金額:1099999.89
ここではVが小数点を表しています。桁数と小数点位置をしっかり設定することで、金額計算でも安全に処理できます。
また、ON SIZE ERRORを必ず書いておくことで、想定外の入力や桁あふれが起きたときにも安心です。
6. まとめ:エラーを恐れず安全に計算しよう
COBOLの数値演算では、「桁あふれ」と「サイズエラー」は避けられないテーマです。しかし、正しいデータ定義とON SIZE ERRORの活用で、トラブルを事前に防げます。
プログラミング初心者の方も、まずは「変数のサイズを大きめに」「サイズエラー処理を必ず書く」ことを意識しましょう。これだけで、より安全で信頼性の高いCOBOLプログラムを書くことができます。