【入門編】FIXED BINARY(p,q)の精度と内部表現 – PL/Iの基本構文とデータ制御実践ガイド

メインフレームの深淵へようこそ:PL/Iの「FIXED BINARY」でハマらないための処方箋

こんにちは。メインフレームの世界へようこそ。
JavaやCOBOLでバリバリ開発してきたあなたにとって、PL/Iは少し「古めかしく、かつ魔法のような言語」に見えるかもしれません。特にデータ宣言は、その自由度の高さゆえに、最初は少し戸惑うこともありますよね。

今日は、PL/Iのデータ制御における「最初にして最大の関門」、`FIXED BINARY(p,q)`についてお話しします。なぜこのデータ型がメモリを食ったり食わなかったりするのか、そしてなぜ計算途中で「魔法のようなエラー」が発生するのか。その謎を解き明かしていきましょう。

1. 「FIXED BINARY(p,q)」って結局何者?

PL/Iの世界では、数値は「基数(2進か10進か)」と「形式(固定か浮動か)」で決まります。
`FIXED BINARY`は、平たく言えば「2進数の整数(または固定小数点数)」です。

  • p (Precision): 精度。保持できるビット数。
  • q (Scale): スケール。小数点以下の位置。

例えば、`DCL VAL FIXED BIN(15, 0);` と書くと、「符号を含めて15ビットを使う、小数点以下のない整数」という意味になります。

ここでのポイントは、「PL/Iは指定した精度によって、裏側で使うメモリ領域を自動的に切り替える」という点です。ここがJavaの`int`や`long`とは違う、メインフレーム特有の「親切すぎてお節介な」ところなんです。

2. メモリ消費の分かれ道:2バイトか、4バイトか?

PL/Iコンパイラは、以下のようにメモリを割り当てます。

  • 1~15ビット (p=15以下)2バイト(HALFWORD) を使用
  • 16~31ビット (p=31以下)4バイト(FULLWORD) を使用

なぜこれが重要なのか?

もしあなたが、10,000程度の数値を扱うために `FIXED BIN(16)` と宣言したとします。
たった1ビット増やしただけで、コンパイラは「あ、これは2バイトに収まらないから4バイト取らなきゃ!」と判断し、メモリ消費が倍増します。

「たかが2バイト」と思うかもしれませんが、何百万件ものレコードを扱うバッチ処理では、この塵も積もれば山となるメモリ効率の差が、パフォーマンスのボトルネックを直撃するのです。

3. 恐怖の「オーバーフロー」:境界線を知る

PL/Iの怖いところは、宣言した精度を超えた値を代入したとき、コンパイラが「静かに」あるいは「残酷に」振る舞うことです。

特に `FIXED BIN(15)` であれば、扱える最大値は $2^{15-1} – 1 = 32,767$ です。これを超える値を入れようとすると、実行時に `SIZE` 条件が発生し、プログラムが異常終了(ABEND)する可能性があります。

1
/ 実務での宣言例 /
DCL COUNTER FIXED BIN(15, 0) INIT(0); / 2バイト確保:最大32,767まで /

/ もしここで32,768を代入しようとすると… /
COUNTER = 32768;

/

  • 実行時にシステムは「そんな大きな箱には入りません!」と
  • SIZEエラーを投げつけてくるかもしれません。
  • COBOLのように勝手に切り捨ててくれると思ったら大間違いなのです。

/

4. 実践的なアドバイス:どう使い分けるべきか?

現場のレガシーなソースを読み解く際は、以下のルールを意識してみてください。

1. 計算の過程を疑う: `FIXED BIN(15)` 同士を掛け算すると、結果は一時的に大きな精度が必要になります。PL/Iは気を利かせて内部で精度を広げて計算しようとしますが、その際の中間結果が精度を超えると計算ミスやエラーの元になります。
2. `p`は必要最小限に: 特段の理由がない限り、32,767以下で収まるカウンタなどは `FIXED BIN(15)` にしましょう。
3. 互換性に注意: 他システムとインターフェースする場合、COBOLの `COMP` (2進整数) とやり取りすることが多いはずです。その際、宣言がズレていると、とんでもない数値に化けます。

最後に:怖がらなくて大丈夫です

PL/Iは、ハードウェアの性能を極限まで引き出すために設計された、非常に論理的な言語です。
「この数値はどれくらいの範囲を動くのか?」「メモリはどれくらい使いたいか?」――これらを一つずつ考えながらコードを書き直す作業は、まるでパズルを解くような楽しさがあります。

もし「この宣言、どうしてこうなっているんだろう?」と迷ったら、その時はまたいつでも聞いてください。当時の設計者の意図を一緒に紐解いていきましょう。

次回は、`FIXED DECIMAL` との使い分けについて深掘りする予定です。それでは、良きメインフレーム・ライフを!

タイトルとURLをコピーしました