浮動小数点数の処理
内部式処理プログラムは、固有の 16 進浮動小数点形式の内部浮動小数点フィールド上で作動します。外部浮動小数点フィールドは、内部浮動小数点フィールドであるかのように、処理される前に倍精度内部フォーマットに変換されます。比較で 2 つのフィールドの精度が異なる場合は、高いほうの精度を持つフィールドが低いほうの精度に丸められ、低いほうの精度を使用して比較が行われます。内部浮動小数点フィールドは外部 (10 進数) 形式に変換されて、ストリングとして REXX に渡され、外部浮動小数点フィールドもストリングとして渡されるため、比較の評価結果は REXX と内部式処理プログラムの間で異なる可能性があります。
整合性を保証するために、浮動小数点フィールドを含む式をコーディングする場合には以下の点に注意してください。
- 浮動小数点フィールドを定数と比較する場合、FMN が使用する外部表記に一致する定数を必ず使用します。例えば、単精度浮動小数点フィールドについては、入力時に
-2.2527494E+08
と-2.2527495E+08
は両方とも'C7D6D6C4'x
として保管されますが、File Manager は常にこのデータを -2.2527494E+08 として表示します。内部式処理プログラムを使用した場合、どちらの値を使用しても値が一致しますが、REXX を使用した場合は、-2.2527494E+08 のみが一致します。 - 外部形式の代わりに 16 進ストリングと不定形式フィールド参照を使用すると、内部浮動小数点値を正確に表すことができます。例えば、
#2 = -2.2527494E+08
の代わりに、#U2 = x2c(C7D6D6C4)
を使用できます。この技法は、x2c()
関数が内部的に処理されないため、式が REXX を必要とする場合のみ、適用できます。 - REXX を使用して異なる精度を持つ浮動小数点フィールドを比較すると、期待された結果が得られない場合があります。これは、値は一致 (丸めの有無は無関係) しても精度が異なる浮動小数点数の外部表記は、一般的に同じではないためです。例えば、
'C7D6D6C4'x (-2.2527494E+08)
の外部表記は、フィールドの余分の精度によってより正確な外部表記が生成されるため、'C7D6D6C4 00000000'x
(-2.2527494400000000E+08)
の外部表記とは異なります。この状態 (内部値が完全に一致する状態) は、長いほうのフィールドの端を切り捨てることによって REXX で処理できます (#2
が短い浮動小数点を示し、#3
が長い浮動小数点を示すと想定します)。#U2 = Substr(#U3,1,4)
内部処理プログラムと同じ結果を得るために丸め処理をシミュレートし、それゆえに異なる精度のフィールド間で等しいことをより一般的にテストするには、次のような特別な式が必要になります。
#U2 = d2c(c2d(Substr(#U3,1,4))+Substr(x2b(c2x(Substr(#U3,5,1))),1,1),4)
これは以下によって行われます。- 長い浮動小数点を 4 バイトに切り捨て、それを 10 進数に変換する。
- 指数部の廃棄された半分の高位バイトを追加する。
- その結果を内部フォーマットに変換する。