【入門編】FLOAT BINARY/DECIMALの浮動小数点演算 – PL/Iの基本構文とデータ制御実践ガイド

メインフレームの深淵へようこそ:PL/Iで「浮動小数点」と仲良くなるための処方箋

こんにちは。IBMメインフレームの世界へようこそ。
JavaやCOBOLの経験がある方にとって、PL/I(ピーエル・ワン)という言語は、まるで「古典的なのに、やたらと高性能な多機能ツール」のように見えるかもしれません。

今日は、そんなPL/Iの入り口で多くのエンジニアが頭を抱える「浮動小数点(FLOAT)」の仕組みについて、現場の知見を交えながら紐解いていきましょう。

そもそも、なぜPL/Iの「数」は種類が多いのか?

COBOLなら`PIC S9(7)V99`のように固定小数点数が王道ですが、PL/Iは科学計算や統計処理もこなせる万能選手。そのため、数値の宣言が少し独特です。

特に混乱しやすいのが、FLOAT BINARYFLOAT DECIMAL です。

  • FLOAT BINARY: コンピュータが計算しやすい「2進数」ベース。実行速度は速いですが、人間がパッと見て直感的な値にならないことがあります。
  • FLOAT DECIMAL: 人間が読みやすい「10進数」ベース。計算結果の整合性を人間が確認しやすいため、会計や精算ロジックで見かけることがあります。

「結局どっちを使えばいいの?」と迷うかもしれませんが、基本的には FLOAT BINARY が標準です。なぜなら、メインフレームのCPUが最も得意とする形式だからです。

浮動小数点の「丸め誤差」という名の迷宮

さて、ここからが本題です。Javaで`double`を使っているときに「0.1 + 0.2 が 0.30000000000000004 になった!」という経験はありませんか? これはPL/Iでも全く同じことが起きます。

なぜ誤差が出るのか?

コンピュータは「2進数」で世界を表現しています。10進数の「0.1」は、2進数に変換すると「0.0001100110011…」と無限に続く循環小数になってしまうんです。
メインフレームのメモリには限りがあるため、どこかでバサッと切り捨てる(丸める)必要があります。この「切り捨てた端っこ」が蓄積することで、計算結果に数円、あるいは数銭のズレが生じる。これが浮動小数点の宿命です。

実践:PL/Iでの宣言と演算のコード例

では、実際にプログラムコードを見てみましょう。PL/Iでは `PACKAGE` や `PROCEDURE` で構造を作ります。

1
/ 浮動小数点演算のサンプルプログラム /
SAMPLE: PROCEDURE OPTIONS(MAIN);

/ FLOAT BINARY(21) は単精度、(53) は倍精度相当です /
DCL VALUE_A FLOAT BINARY(53) INIT(0.1);
DCL VALUE_B FLOAT BINARY(53) INIT(0.2);
DCL RESULT FLOAT BINARY(53);

/ 計算処理 /
RESULT = VALUE_A + VALUE_B;

/ 結果を出力(PUT EDITはC言語のprintfのようなものです) /
PUT SKIP EDIT (‘RESULT IS: ‘, RESULT) (A, F(20, 17));

/
注意点:
もし「正確な金額」を扱いたい場合は、FLOATを使わず
FIXED DECIMAL(15, 2) を使いましょう。
金融系ではこれが鉄則です。
/

END SAMPLE;

現場のアーキテクトからのアドバイス

PL/Iを扱う上で、一番大切なのは「用途に応じた型選び」です。

1. 科学技術計算や統計データ:`FLOAT BINARY` を使いましょう。速度重視で、かつ多少の誤差が許容される領域です。
2. 金融計算・勘定系:絶対に `FLOAT` を使ってはいけません。`FIXED DECIMAL` を使ってください。これは10進数の固定小数点として動作し、私たちが日頃使う「10進数」の計算を正確に再現してくれます。

「怖い」と思わなくて大丈夫

メインフレームの言語仕様は一見すると厳格ですが、それは「一度書いたロジックが何十年も安定して動き続けるため」の知恵です。

浮動小数点で計算が合わないときは、「あ、これはコンピュータが2進数で頑張りすぎた結果なんだな」と優しく受け止めてあげてください。そして、必要に応じて固定小数点の型へ切り替える。その冷静な判断ができれば、あなたはもう立派なメインフレーム・エンジニアです。

PL/Iの世界は奥が深いですが、一度慣れるとこれほど頼もしい相棒はいません。ぜひ、恐れずに色々なデータ型を試してみてくださいね。

それでは、また次回の深掘り記事でお会いしましょう!

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