メインフレームの深淵へようこそ:PL/Iの浮動小数点と「誤差」の正体
皆さん、こんにちは。基幹システムの現場で数十年、メインフレームという巨大な「鉄の箱」と対話し続けてきたシステムアーキテクトです。
今回から数回にわたり、PL/I(Programming Language One)という、一見すると古めかしく、しかし一度ハマると抜け出せないほど強力な言語の世界を紐解いていきます。JavaやCOBOLには慣れているけれど、PL/Iのコードを目の当たりにして「一体これは何なんだ?」と面食らっているあなたへ。大丈夫、怖がる必要はありません。一つずつ、その仕組みを噛み砕いていきましょう。
—
1. PL/Iの基本構造:まずは「ここ」から
PL/Iのプログラムは、いわば「整然としたオーケストラ」です。最も基本的な構成を見てみましょう。
/i
MY_PROGRAM: PACKAGE; / プログラムの入り口を宣言 /
/ ここに共通のデータ定義を置くこともできます /
MAIN_PROC: PROCEDURE OPTIONS(MAIN); / これが実行の起点です /
PUT SKIP LIST (‘Hello, Mainframe World!’);
END MAIN_PROC;
END MY_PROGRAM;
`OPTIONS(MAIN)` は、OS(z/OSなど)に対して「ここからプログラムを開始してくれ」と伝えるための合図です。Javaの `public static void main` と同じ役割ですね。シンプルでしょう?
—
2. 浮動小数点の二面性:FLOAT BINARYとFLOAT DECIMAL
さて、今日の核心である「浮動小数点」の話をしましょう。PL/Iには大きく分けて二つの浮動小数点型があります。
- FLOAT BINARY: コンピュータが計算しやすい「2進数」で保持する型。計算速度が速いのが特徴です。
- FLOAT DECIMAL: 人間が読みやすい「10進数」で保持する型。正確な値を扱いたい場合に重宝されます。
ここで多くのエンジニアが躓くのが「丸め誤差」です。
なぜ誤差が生まれるのか?
例えば、0.1という数字。私たちは10進数で完璧に表現できますが、2進数の世界(FLOAT BINARY)では、0.1を有限の桁数で表現できません。循環小数になってしまうからです。
Javaの `double` 型で `0.1 + 0.2 == 0.3` が `false` になるのと同じ現象が、PL/Iでも起きます。これをメインフレームの基幹ロジックでやらかすと、金額の計算などで数円のズレが生じ、夜間バッチが異常終了する……という冷や汗ものの事態に発展します。
—
3. 実践:誤差を回避するための勘所
以下のコード例を見てください。比較演算において、浮動小数点がいかに「危うい」かが見えてきます。
/i
TEST_PRECISION: PROCEDURE OPTIONS(MAIN);
DCL BIN_VAL FLOAT BINARY(53) INIT(0.1); / 2進数浮動小数点 /
DCL DEC_VAL FLOAT DECIMAL(16) INIT(0.1); / 10進数浮動小数点 /
/ 比較演算の罠:0.1 + 0.2 は 0.3 にならないことがある /
IF (BIN_VAL + 0.2) = 0.3 THEN
PUT SKIP LIST (‘一致しました’);
ELSE
PUT SKIP LIST (‘誤差により一致しません!’); / こちらが実行される可能性大 /
/ 正確な計算が必要なら、FIXED DECIMALを使うのが鉄則 /
DCL FIXED_VAL FIXED DECIMAL(15, 2) INIT(0.1);
PUT SKIP LIST (‘FIXED DECIMALなら安心です’);
END TEST_PRECISION;
アーキテクトからのアドバイス
もしあなたが、銀行の預金残高や商品の単価計算を任されたなら、「浮動小数点(FLOAT)は使わない」という選択肢をまず検討してください。
PL/Iには `FIXED DECIMAL` という非常に強力な型があります。これは「固定小数点数」と呼ばれ、小数点以下の桁数を固定して厳密に計算します。これこそが、COBOLからPL/Iへ移行する際、あるいはメインフレームで金融システムを構築する際に最も重要な「守りの技術」です。
—
最後に:怖がらなくて大丈夫
PL/Iは一見、記述のルールが厳格で取っ付きにくいかもしれません。しかし、それはシステムが「曖昧さを許さない」という、非常に堅牢な設計思想に基づいているからです。
「なぜこの型を使っているのか?」「なぜここで比較誤差が出るのか?」という疑問を一つずつ解き明かしていけば、PL/Iはあなたの強力な武器になります。
次回は、PL/I特有の「構造体(STRUCTURE)」や、メモリを直接叩くポインタ操作の恐ろしさと魅力についてお話ししましょう。何かわからないことがあれば、いつでも現場のアーキテクトに聞いてくださいね。一緒に学んでいきましょう!
