導入
業務システムにおける計算処理では、数値の偶奇判定や、一定間隔での処理振り分けなど、「余り(剰余)」を求めるケースが頻繁に発生します。従来のCOBOLではDIVIDE文とREMAINDER句を組み合わせるのが定石でしたが、これだと計算のたびに記述が長くなり、コードの可読性が下がる原因にもなります。そこで活用したいのが、式の中で直接使える組込関数「REM」です。本稿では、この関数を使ってスマートに余りを求める方法を解説します。
基礎知識
関数「REM」は、第一引数(被除数)を第二引数(除数)で割った余りを返します。数学的な剰余演算を行う際に非常に便利です。ここで重要なポイントは、「余りの符号は割られる数(第一引数)の符号に一致する」という性質です。例えば、負の数を割った場合、結果も負の値やゼロになるため、計算結果を扱う際にはこの仕様を理解しておく必要があります。
実装/解決策
REM関数は「FUNCTION REM(引数1, 引数2)」という形式で記述し、COMPUTE文の中に直接組み込むことができます。これにより、一時的な作業領域(REMAINDER用変数)を定義することなく、簡潔にロジックを完結させることが可能です。
サンプルプログラム
以下のコードは、数値を2で割った余りを判定して、偶数か奇数かを判別する実用例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. REM-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 VAL-TEST PIC S9(04) VALUE 15.
01 WS-AMARI PIC S9(04).
PROCEDURE DIVISION.
- REM関数を使用して15を2で割った余りを算出
- 戻り値はWS-AMARIに格納される
COMPUTE WS-AMARI = FUNCTION REM(VAL-TEST, 2).
- 判定処理
IF WS-AMARI = 0 THEN
DISPLAY “数値: ” VAL-TEST ” は偶数です。”
ELSE
DISPLAY “数値: ” VAL-TEST ” は奇数です。”
END-IF.
STOP RUN.
応用・注意点
REM関数を使用する際、最も注意すべきは「第二引数に0を指定しないこと」です。ゼロ除算が発生し、プログラムが異常終了する原因となります。計算を行う前に、除数となる変数が0でないか、あるいは正の数であることをチェックするロジックを前段に置くのが、ベテランの安全な書き方です。また、MOD関数との違いにも注意しましょう。REM関数は割られる数の符号を引き継ぎますが、MOD関数は割る数の符号を引き継ぎます。用途に合わせて適切に使い分けることが、バグを防ぐポイントです。

コメント