1. 導入:なぜ今、MOD関数なのか?
COBOLでプログラミングをしていると、「数値を一定の範囲で循環させたい」「奇数・偶数を判定したい」「データのグループ分けをしたい」といった場面によく遭遇します。そんなとき、単に「余り」を求めるだけで済ませていませんか?実は、プログラミングにおいて「負の数」が含まれる場合の余りの扱いは意外と落とし穴になりやすいのです。MOD関数を正しく使うことで、数学的に整合性の取れた計算が可能になり、バグの少ない堅牢なコードが書けるようになります。
2. 基礎知識:MOD関数とは?
MOD関数は、数学的な「剰余(モジュロ)」を求めるための組込関数です。
ここで重要なのは、COBOLには似た機能として「REM関数」も存在する点です。両者の最大の違いは「結果の符号」にあります。
MOD関数:結果の符号は、必ず「割る数(第2引数)」と一致します。
REM関数:結果の符号は、必ず「割られる数(第1引数)」と一致します。
周期的な計算やインデックス(配列の添字など)を扱う場合、負の数が出たときに結果がマイナスになると困ることが多いですよね。MOD関数を使えば、常に正の範囲に収めるような制御がしやすくなるため、より直感的なロジックが組めます。
3. 実装と解決策
MOD関数は FUNCTION MOD(数値1, 数値2) という形式で使用します。
計算結果は「数値1 ÷ 数値2」の余りとなります。
例えば、カレンダーの週の計算や、配列のインデックスを特定のサイズで循環させる際に、「マイナスの値が入力されても、期待通りに正の数値として扱いたい」というケースでは、このMOD関数が非常に強力な武器になります。
4. サンプルプログラム
以下のコードは、MOD関数の挙動を確認するためのサンプルです。コピーして環境で試してみてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. MOD-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 VAL-1 PIC S9(4) VALUE -10.
01 VAL-2 PIC 9(4) VALUE 3.
01 WS-RESULT PIC S9(4).
PROCEDURE DIVISION.
> MOD関数の計算実行
> -10 を 3 で割った数学的な剰余を求める
COMPUTE WS-RESULT = FUNCTION MOD(VAL-1, VAL-2)
> 結果を表示 (結果は 2 となります)
DISPLAY “計算結果: ” WS-RESULT
STOP RUN.
5. 応用・注意点
現場で役立つポイントをいくつかお伝えします。
・割る数が0の場合: どんな関数でもそうですが、0で割ることはできません。MOD関数で第2引数に0を指定すると、実行時にエラー(ゼロ除算)が発生します。計算前に必ず割る数が0ではないかチェックする習慣をつけましょう。
・浮動小数点数との併用: MOD関数は浮動小数点数も扱えますが、計算精度には注意が必要です。可能な限り整数演算で使用することをおすすめします。
・REM関数との使い分け: 「符号を気にせず、単純に余りの絶対値が欲しい」といった単純な割り算の処理であればREM関数で十分な場合もあります。しかし、業務ロジックで「0から始まる連番を循環させる」ような処理では、MOD関数のほうが圧倒的にバグが少なく、読みやすいコードになります。
MOD関数を使いこなして、より洗練されたCOBOLプログラムを目指しましょう!

コメント