算術演算子

算術演算子とそれが表す演算は次のとおりです。

演算子     演算
プレフィックス + プラス
プレフィックス – マイナス
+ 加算
減算
* 乗算
/ 除算
** べき乗

複合代入演算子もあります。これらは次のとおりです。

+= -= *= /=

次の文のペアはそれぞれ同等です。

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 つのオペランドのデータ型が異なる場合、次の表に示すように、オペランドは共通の算術データ型に変換されます。

一方のオペランド     他方のオペランド     共通オペランド
fixed float float
binary decimal binary (浮動小数点または整数の結果の場合)
binary decimal decimal (固定小数点の整数以外の結果の場合)

べき乗を除くすべての算術演算は、2 つのオペランドの派生型で実行されます(オペランドを派生型に変換した結果の精度については、「Arithmetic to Arithmetic Conversion」の表を参照)。2 つの変換されたオペランドは、導出された同じ基数およびスケールを持つことができますが、それぞれの p および q の値 (それぞれスケールおよび基数を表す) は異なる場合があります。

べき乗を含むすべての算術演算では、演算が実行される型と同じデータ型を持つ結果が生成されます。べき乗を除くすべての演算では、データ型が導出されます。

算術演算が浮動小数点で実行される場合、結果の精度は、2 項演算子の場合は 2 つのオペランドのうちの最大精度となり、単項演算子の場合はオペランドの精度と等しくなります。この精度が目的とする結果の精度でない場合は、FLOAT() 組み込み関数を使用して、オペランドの一方または両方の精度を上げてください。

浮動小数点 10 進データに対するべき乗演算は、実際は浮動小数点 2 進演算を使用して実行されます。そのため、その演算のオペランドの範囲と結果は、浮動小数点 2 進数の範囲に制限されます。

このトピックの以降の内容では、2 つのオペランドの小数点を揃えて固定小数点の結果を生成することで式の結果を効果的に整列できる、固定小数点精度規則と呼ばれる一連の規則を定義します。結果の桁数は、結果の基数の実装で許容される最大桁数によって常に制限されます。ただし、小数点以下の桁数は、除算の結果を除き、実装で許容される桁数だけ維持されます(この実装の詳細については、『Open PL/I ユーザー ガイド』を参照)。除算の場合、商の整数の桁数はすべて維持され、小数点以下の桁数は実装で許容される桁数だけ維持されます。

べき乗を除くすべての算術演算の結果の精度は、常に変換されたオペランドのうちの最大精度となります。

算術式の結果の精度を決定する規則は次のとおりです。

  1. プラスおよびマイナスは、変換されたオペランドと同じデータ型の結果を生成します。
  2. 固定小数点値の加算および減算は、基数が共通の基数で精度が次のようになる固定小数点の結果を生成します。
    FIXED(P,Q)±FIXED(R,S)

    また、次のようになります。

    P=MIN(N,1+MAX(P-Q,R-S)+MAX(Q,S)) 
    Q=MAX(Q,S)

    各要素を次に示します。

    N は、結果の基数の固定小数点値に対する実装の最大許容精度です (『Open PL/I ユーザー ガイド』を参照)。

    (P,Q) は、第 1 オペランドの変換後の精度です。

    (R,S) は、第 2 オペランドの変換後の精度です。

  3. 整数のオペランド (Q=0 および S=0) の場合、結果の精度式は次のように変わります。
    FIXED(P,0)±FIXED(R,0)

    また、次のようになります。

    P=MIN(N,1+MAX(P,R)) 
    Q=0
  4. 固定小数点値の乗算は、基数が共通の基数で精度が次のようになる固定小数点の結果を生成します。
    FIXED(P,Q)*FIXED(R,S)

    また、次のようになります。

    
    P=MIN(N,P+R+1) Q=Q+S

    各要素を次に示します。

    N は、結果の基数の固定小数点値に対する実装の最大許容精度です (『Open PL/I ユーザー ガイド』を参照)。

    (P,Q) は、第 1 オペランドの変換後の精度です。

    (R,S) は、第 2 オペランドの変換後の精度です。

  5. 整数のオペランド (Q=0 および S=0) の場合、結果の精度式は次のように変わります。
    FIXED(P,0)/FIXED(R,0)

    また、次のようになります。

    P=MIN(N,P+R+1) 
    Q=0
  6. 固定小数点値の除算は、両方のオペランドが固定小数点値の場合にのみ実行できます。結果は精度の固定小数点値です。
    FIXED(P,Q)/FIXED(R,S)

    また、次のようになります。

    
    P=N 
    Q=N-P+Q-S

    各要素を次に示します。

    N は、固定小数点の最大精度です。

    (P,Q) は、第 1 オペランドの精度です。

    (R,S) は、第 2 オペランドの精度です。

  7. 整数のオペランド (Q=0 および S=0) の場合、前の式は次のように変わります。
    FIXED(P,0)/FIXED(R,0)

    また、次のようになります。

    P=N 
    Q=N-P

    この式は、商の整数のすべての桁数および実装で許容される小数点以下の桁数に対して十分な精度を持つ結果の商を生成します (Open PL/I の制限については、『Open PL/I ユーザー ガイド』を参照)。

  8. 除算演算の結果では小数部が大きくなる場合があり、このような場合は、小数点を他の値と揃えると、結果が大きくなりすぎて Open PL/I でサポートできなくなるため、除算演算の結果を別の値で加算または乗算できない可能性があります。
  9. ADD、DIVIDE、および MULTIPLY 組み込み関数を使用すると、固定小数点 2 進値および固定小数点値の加算、除算、および乗算を実行できます。これらの関数では結果の精度を制御できます。「Open PL/I Built-Ins」の章の「DECIMAL 関数」を参照してください。
  10. べき乗は、基数、スケール、および精度がオペランドによって異なる結果を生成します。結果は次のように決定されます。

    ケース 1:

    第 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:

    第 2 オペランドが固定小数点整数値で、ケース 1 が適用されない場合、結果は、基数が第 1 オペランドの基数で精度が次のようになる浮動小数点値になります。

    P=MIN(N,P)

    ここで、N は結果の基数の浮動小数点値に許容される最大精度で、P は第 1 オペランドの精度です。

    ケース 3:

    ケース 1 もケース 2 も適用されない場合、結果は、共通の基数を持ち精度が次のようになる浮動小数点値になります。

    P=MIN(N,MAX(P,R))

    ここで、N は結果の基数を持つ浮動小数点値に許容される最大精度、P は第 1 オペランドの変換後の精度、R は第 2 オペランドの変換後の精度です。

  11. べき乗の結果は、通常、第 1 オペランドの第 2 オペランド乗になります。この一般規則の例外は次のとおりです。

    X をオペランド 1 の値とし、Y をオペランド 2 の値とします。

    • X = 0 かつ Y <= 0 の場合は、ERROR が通知されます。
    • X < 0 かつケース 1 が適用されない場合は、ERROR が通知されます。
  12. 加算演算、乗算演算、および除算演算と AND、OR、MOD、MIN、および MAX 組み込み関数では、両方のオペランドが UNSIGNED FIXED BINARY の場合、結果は UNSIGNED FIXED BINARY になります。