【実務・中級編】FLOAT BINARYとFLOAT DECIMALの精度と丸め誤差 – PL/Iの基本構文とデータ制御実践ガイド

メインフレームの闇を照らす:PL/Iにおける浮動小数点の「誤差」と向き合う技術

若手エンジニアからよく相談される。「なぜ、計算結果が期待値とわずかに食い違うのか?」と。
勘定系のバッチ処理や、複雑な統計計算を抱える大規模システムにおいて、浮動小数点数の扱いは避けて通れない関門だ。特にPL/Iを扱う我々にとって、`FLOAT BINARY`と`FLOAT DECIMAL`の特性を理解していないことは、爆弾を抱えて稼働するようなものだと言わざるを得ない。

今日は、メインフレームの深淵に触れるこのテーマについて、現場の実務視点で紐解いていく。

1. なぜ「浮動小数点」で悩むのか:二進数と十進数の溝

コンピュータは二進法で動いている。これは周知の事実だが、人間が扱う「10進数の小数(例:0.1)」を二進数で正確に表現しようとすると、無限小数になってしまう。

  • FLOAT BINARY: 計算速度は速いが、二進数基底であるため、10進数表現との間に変換誤差が生じる。
  • FLOAT DECIMAL: 10進数表現に近いが、内部的には浮動小数点として扱われるため、やはり計算精度の限界(丸め誤差)からは逃れられない。

基幹システムでは、金額計算に`FIXED DECIMAL`(パック十進数)を用いるのが鉄則だが、科学技術計算や複雑な係数処理で`FLOAT`を使わざるを得ない場面もある。その際、安易な比較演算がシステムを迷走させる原因となる。

2. 実践:浮動小数点の比較と制御フロー

まず、悪い例を想像してほしい。浮動小数点の計算結果を `IF A = B THEN` で比較するコード。これはメインフレームのバッチ処理において、最も危険な記述の一つだ。

推奨される実装パターン

以下に、精度の限界を考慮した比較ロジックと、`ON`ユニットを用いた例外制御の例を示す。

1
/ PROGRAM: FLOAT_CHECK.PLI /
/ 浮動小数点の誤差を考慮した比較とエラーハンドリングの実装例 /

TEST_FLOAT: PROC OPTIONS(MAIN);

DCL A FLOAT BINARY(21); / 精度を指定 /
DCL B FLOAT BINARY(21);
DCL EPSILON FLOAT BINARY(21) INIT(1E-7); / 許容誤差範囲 /
DCL DIFF FLOAT BINARY(21);

/ ONユニットで浮動小数点例外を補足する /
ON OVERFLOW BEGIN;
PUT SKIP LIST(‘警告: 浮動小数点オーバーフローが発生しました’);
/ ここでログ出力やダンプ、異常終了処理を行う /
END;

A = 0.1E0 3.0E0;
B = 0.3E0;

/ 悪い例: IF A = B THEN … (これでは誤差によりFalseになる可能性がある) /

/ 良い例: 絶対値の差が許容範囲内かを確認する /
DIFF = ABS(A – B);
IF DIFF < EPSILON THEN PUT SKIP LIST('比較結果: 誤差範囲内で一致とみなします'); ELSE PUT SKIP LIST('比較結果: 不一致です'); END TEST_FLOAT; ---

3. 現場で生き残るためのテクニック

VSAMアクセスとFLOATの併用

VSAMファイルからデータを読み込む際、レイアウト上で`FLOAT`として定義された項目を読み込むことはよくある。このとき、注意すべきは「データパディング」と「アライメント」だ。複雑な構造体(`BASED`変数など)でアクセスする際は、コンパイラオプションの`ALIGN`を正しく理解しておかないと、思わぬオフセットのズレを生む。

ONユニットの活用

`ON FIXEDOVERFLOW`や`ON ZERODIVIDE`は書くことがあっても、`ON CONVERSION`(文字から数値への変換ミス)を軽視してはならない。浮動小数点計算で予期せぬ値が入り込んだ際、計算処理自体を停止させるのではなく、`ON`ユニットで「異常値の補正」や「詳細なトレース情報の出力」を行っておくのが、保守性の高いコードの条件だ。

コンパイラオプションの選別

`FLOAT(DFP)`オプションを使用できる環境であれば、IEEE 754十進浮動小数点演算を積極的に活用すべきだ。従来のIBMの浮動小数点形式よりも、現代的なアプリケーションとの親和性が高く、丸め誤差の挙動も安定している。

最後に:職人の矜持として

PL/Iは、極めれば極めるほど「なぜ設計者がその仕様にしたのか」という背景が見えてくる言語だ。浮動小数点の誤差という「コンピュータの物理的な限界」を理解し、それをコードで制御すること。それが、我々メインフレーマーの矜持ではないだろうか。

単に「動くもの」を作るのではなく、「10年後、誰が修正しても迷わないロジック」を書くこと。今回の浮動小数点の比較テクニックも、ぜひあなたの武器の一つに加えてほしい。

何か特定の計算で数値が合わない、あるいはコンパイラの最適化に振り回されているといった悩みがあれば、いつでも相談してくれ。現場の知恵を共有しよう。

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