メインフレームの世界へようこそ!PL/I浮動小数点の「落とし穴」を怖がらずに歩こう
こんにちは!長年、巨大なメインフレームの深淵でシステムアーキテクトとして格闘してきた私です。
JavaやCOBOLの世界からやってきた方にとって、PL/I(ピーエル・ワン)は少し「異質な存在」に見えるかもしれません。特に、浮動小数点数の扱いは、現代のPC環境とメインフレームの歴史的な経緯が交差する、非常にエキサイティング(あるいは少し恐ろしい)領域です。
今日は、PL/Iで避けては通れない「FLOAT BINARY」と「FLOAT DECIMAL」、そしてIBM独自の浮動小数点形式について、現場の知見を交えて優しく紐解いていきましょう。
—
1. まずは基本の「顔」を覚える:プログラム構造
PL/Iのプログラムは、いわば「大きな箱」の中に「処理の塊」が入っているようなイメージです。
/i
/ プログラムの始まりは PACKAGE や PROCEDURE で定義します /
MY_CALC_PROG: PACKAGE;
/ メイン処理の入り口。OPTIONS(MAIN)は「ここから実行してね!」という合図です /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);
/ ここに変数宣言や処理を書きます /
DCL RATE FLOAT BINARY(21); / 精度を指定するのがPL/I流 /
PUT SKIP LIST(‘計算を開始します’);
END MAIN_PROC;
END MY_CALC_PROG;
COBOLに慣れていると、この「宣言(DCL)」の自由度の高さに少し驚くかもしれませんね。でも大丈夫、基本は「名前を付けて、型を決める」だけです。
—
2. 浮動小数点の二面性:IEEE 754 vs IBM形式
さて、本題です。「浮動小数点数」と聞くと、皆さんは何を思い浮かべますか?現代のプログラミング言語では、ほとんどが「IEEE 754」という世界共通の規格を使っています。
しかし、IBMメインフレームには「IBM浮動小数点形式(16進形式)」という、歴史の重みが詰まった伝統的なフォーマットが存在します。
- IBM形式(伝統): 16進数で表現される浮動小数点。メインフレームの古い資産との互換性は抜群ですが、微小な精度劣化が独特の癖として現れることがあります。
- IEEE 754(現代): 私たちが普段JavaやC++で使っているもの。現代のCPU設計に最適化されています。
なぜこれが問題になるのか?
古いシステムをマイグレーションする際、「以前と同じ計算式なのに、最後の桁の数字が1だけ違う!」という現象によく遭遇します。これは、計算の途中でIBM形式の誤差が蓄積し、丸め処理のタイミングでIEEE形式と結果がズレることで発生します。
—
3. 実践:浮動小数点の宣言と注意点
PL/Iでは、次のように宣言します。
/i
DCL VAL_BIN FLOAT BINARY(53); / IEEE 754の倍精度相当 /
DCL VAL_DEC FLOAT DECIMAL(15); / 10進浮動小数点 /
ここで重要なのは、「コンパイラオプション」です。
IBMのコンパイラには、計算をどちらの方式で行うかを制御するオプション(`FLOAT(IEEE)` や `FLOAT(HEX)`)が存在します。
もし、あなたが今、古いPL/Iコードを保守しているなら、まずコンパイルリスト(コンパイル結果のレポート)を開いて、どのオプションが指定されているか確認してみてください。「なぜこの値になるの?」という謎のほとんどは、このオプション設定が鍵を握っています。
—
4. 現場からのアドバイス:精度劣化と向き合う
初学者の皆さんが一番怖いのは「計算誤差」ですよね。でも、過度に恐れる必要はありません。
1. 「厳密な金額計算」には浮動小数点を使わない: これはメインフレームでも同じです。金額計算には `FIXED DECIMAL`(固定小数点)を使いましょう。浮動小数点を使うのは、あくまで科学技術計算や統計など「近似値でも許容される計算」に留めるのが鉄則です。
2. 比較演算には注意する: `IF A = B THEN …` という比較は、浮動小数点数に対しては非常に危険です。「限りなく近いなら等しいとみなす」といった、許容誤差(イプシロン)を持たせた比較関数を自作するのが、ベテランの知恵です。
最後に
PL/Iは、非常に論理的で、かつ「プログラマの意図」を最大限に尊重してくれる懐の深い言語です。浮動小数点の違いに悩むことは、メインフレームという巨大なシステムの歴史の一部に触れているという証でもあります。
「動かない」と焦ったときは、ぜひ一度、その変数がどのような型で宣言され、どのような形式で計算されているのか、落ち着いて紐解いてみてください。私たちがついていますから、大丈夫ですよ。
次回の記事では、PL/Iの構造体(STRUCTURE)の面白い使い方について解説します。お楽しみに!
