a = a + b; a += b;
a = a - b ; a -= b;
a = a * b; a *= b;
a = a / b; a /= b;
算術演算子には算術オペランドが必要です。これらのオペランドは異なる算術型でもかまいませんが、すべての演算は同じ型のオブジェクトに対して実行する必要があります。ピクチャ値は固定小数点値に変換されますが、その他の非算術値は、BINARY、DECIMAL、FIXED、FLOAT などの変換組み込み関数のいずれかによって、算術値に変換する必要があります。
中置演算子 (** 以外) の 2 つのオペランドのデータ型が異なる場合、次の表に示すように、オペランドは共通の算術データ型に変換されます。
べき乗を除くすべての算術演算は、2 つのオペランドの派生型で実行されます(オペランドを派生型に変換した結果の精度については、「Arithmetic to Arithmetic Conversion」の表を参照)。2 つの変換されたオペランドは、導出された同じ基数およびスケールを持つことができますが、それぞれの p および q の値 (それぞれスケールおよび基数を表す) は異なる場合があります。
べき乗を含むすべての算術演算では、演算が実行される型と同じデータ型を持つ結果が生成されます。べき乗を除くすべての演算では、データ型が導出されます。
算術演算が浮動小数点で実行される場合、結果の精度は、2 項演算子の場合は 2 つのオペランドのうちの最大精度となり、単項演算子の場合はオペランドの精度と等しくなります。この精度が目的とする結果の精度でない場合は、FLOAT() 組み込み関数を使用して、オペランドの一方または両方の精度を上げてください。
浮動小数点 10 進データに対するべき乗演算は、実際は浮動小数点 2 進演算を使用して実行されます。そのため、その演算のオペランドの範囲と結果は、浮動小数点 2 進数の範囲に制限されます。
このトピックの以降の内容では、2 つのオペランドの小数点を揃えて固定小数点の結果を生成することで式の結果を効果的に整列できる、固定小数点精度規則と呼ばれる一連の規則を定義します。結果の桁数は、結果の基数の実装で許容される最大桁数によって常に制限されます。ただし、小数点以下の桁数は、除算の結果を除き、実装で許容される桁数だけ維持されます(この実装の詳細については、『Open PL/I ユーザー ガイド』を参照)。除算の場合、商の整数の桁数はすべて維持され、小数点以下の桁数は実装で許容される桁数だけ維持されます。
べき乗を除くすべての算術演算の結果の精度は、常に変換されたオペランドのうちの最大精度となります。
FIXED(P,Q)±FIXED(R,S)
P=MIN(N,1+MAX(P-Q,R-S)+MAX(Q,S)) Q=MAX(Q,S)
FIXED(P,0)±FIXED(R,0)
P=MIN(N,1+MAX(P,R)) Q=0
FIXED(P,Q)*FIXED(R,S)
P=MIN(N,P+R+1) Q=Q+S
FIXED(P,0)/FIXED(R,0)
P=MIN(N,P+R+1) Q=0
FIXED(P,Q)/FIXED(R,S)
P=N Q=N-P+Q-S
FIXED(P,0)/FIXED(R,0)
P=N Q=N-P
この式は、商の整数のすべての桁数および実装で許容される小数点以下の桁数に対して十分な精度を持つ結果の商を生成します (Open PL/I の制限については、『Open PL/I ユーザー ガイド』を参照)。
第 1 オペランドが固定小数点で、第 2 オペランドが値 Y の整数定数である場合に、(P+1)*Y-1 が N を超えないときには、結果は、基数が第 1 オペランドの基数で精度が次のようになる固定小数点値になります。
FIXED(P,Q)**Y /* Y is an integer constant */
P=(P+1)*Y-1 Q=Q*Y P<=N
ここで、N は第 1 オペランドの基数の固定小数点値に許容される最大精度、(P,Q) は第 1 オペランドの精度、Y は第 2 オペランドの値です。
第 2 オペランドが固定小数点整数値で、ケース 1 が適用されない場合、結果は、基数が第 1 オペランドの基数で精度が次のようになる浮動小数点値になります。
P=MIN(N,P)
ここで、N は結果の基数の浮動小数点値に許容される最大精度で、P は第 1 オペランドの精度です。
ケース 1 もケース 2 も適用されない場合、結果は、共通の基数を持ち精度が次のようになる浮動小数点値になります。
P=MIN(N,MAX(P,R))
ここで、N は結果の基数を持つ浮動小数点値に許容される最大精度、P は第 1 オペランドの変換後の精度、R は第 2 オペランドの変換後の精度です。
X をオペランド 1 の値とし、Y をオペランド 2 の値とします。