PL/Iの「FIXED DECIMAL」を攻略する!パック10進数の世界へようこそ
こんにちは!メインフレームの世界へようこそ。
JavaやCOBOLを触ってきた皆さんが、PL/Iのソースコードを開いて最初に「おや?」と思うのが、この`FIXED DECIMAL(p,q)`という独特な書き方ではないでしょうか。
「なぜわざわざ桁数を指定するの?」「計算で小数点はずれないの?」といった疑問は、この言語を習得する誰もが通る道です。今日は、メインフレームの心臓部でバリバリ活躍している「パック10進数」の秘密を、一緒に紐解いていきましょう。大丈夫、仕組みさえ掴めば怖くありませんよ。
—
そもそも「FIXED DECIMAL」って何者?
Javaの`double`や`float`(浮動小数点数)は、科学計算には強いのですが、どうしても「0.1 + 0.2 が 0.30000000000000004 になる」といった、金融システムでは許されない誤差が生じることがあります。
そこでメインフレームの世界では、「10進数を人間が書いた通りに正確に保持する」という哲学を貫いています。それが`FIXED DECIMAL`です。
宣言のルール:p と q の意味
`FIXED DECIMAL(p, q)` は、このように読み解きます。
- p (Precision): 全体の有効桁数
- q (Scale): 小数点以下の桁数
例えば、`DCL BALANCE FIXED DECIMAL(7, 2);` と宣言すると、これは「全体で7桁、そのうち2桁が小数点以下」という意味になり、最大で `99999.99` までを扱える箱がメモリ上に確保されます。
—
パック10進数(COMP-3)のリアルな姿
メインフレームのストレージにおいて、`FIXED DECIMAL`はパック10進数(COMP-3形式)という形式で格納されます。
「パック」という言葉の通り、1バイトに2桁の数値をギュッと詰め込んでいます。最後の4ビット(ニブル)には、プラスかマイナスかを示す「符号」が書き込まれます。
- メリット: 10進数で管理されているため、計算誤差がゼロ。
- 注意点: 奇数桁で宣言するとストレージ効率が良いですが、偶数桁で宣言すると先頭の4ビットが未使用(0になる)という、メインフレームらしい「端数へのこだわり」があったりします。
—
演算時の「自動調整ロジック」を知ろう
PL/Iが頼もしいのは、演算時の小数点位置合わせをコンパイラが自動でやってくれる点です。COBOLの`COMPUTE`文に近い感覚ですが、PL/Iはもっと柔軟です。
実践コードで見る計算の流れ
/i
/ パッケージの宣言から始まるのがPL/Iの作法です /
CALC_SAMPLE: PACKAGE;
/ メイン処理の手続き /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);
/ 宣言:7桁中、小数点以下が2桁 /
DCL PRICE FIXED DECIMAL(7, 2) INIT(100.50);
DCL TAX_RATE FIXED DECIMAL(3, 3) INIT(0.080);
DCL TOTAL_TAX FIXED DECIMAL(9, 4); / 計算結果のために大きめに確保 /
/
- ここがPL/Iの凄いところ!
- コンパイラが、PRICE(7,2) と TAX_RATE(3,3) の掛け算を行う際、
- 自動的に小数点位置を計算して TOTAL_TAX に代入してくれます。
- プログラマが小数点合わせのシフト演算を気にする必要はありません。
/
TOTAL_TAX = PRICE TAX_RATE;
/
- コンソールに出力して確認してみましょう
- 日本語のコメントもPL/Iなら安心です
/
PUT SKIP LIST(‘計算結果:’, TOTAL_TAX);
END MAIN_PROC;
END CALC_SAMPLE;
—
初学者がハマりやすいポイント:桁あふれ(OVERFLOW)
PL/Iの親切なところは「自動調整」ですが、逆に言うと「結果が宣言した変数のサイズを超えたとき」にどうなるかが重要です。
- 精度の保持: 加算や減算では、小数点位置が揃うように自動調整されます。
- 桁あふれ: もし計算結果が、受け皿となる変数の `p`(全桁数)を超えてしまうと、実行時に「FIXEDOVERFLOW」というエラー(割り込み)が発生します。
アドバイス:
実務では、計算結果を受け取る変数は、入力値よりも少し余裕を持った `p` を設定するのが安全です。「計算結果が足りなくて異常終了した…」とならないよう、中間変数の桁数は少し多めに確保する癖をつけておくと、現場のベテランからも「お、分かってるね」と信頼されますよ。
—
最後に:怖がらずに触ってみてください
PL/Iは古くからある言語ですが、そのメモリ管理や数値演算の信頼性は、現代の金融・物流基幹システムでも決して色褪せていません。
`FIXED DECIMAL`は、いわば「デジタルでありながら、紙の帳簿のような正確さ」を追求した結晶です。最初は `p` と `q` の指定に戸惑うかもしれませんが、それは「データの形を正しく定義する」という、プログラミングの本質に触れている証拠です。
皆さんが書くコードが、メインフレームの安定稼働を支える大きな力になることを応援しています。また何かあれば、いつでも聞きに来てくださいね!
