Rational Developer for System z
Enterprise PL/I for z/OS, Version 3.8, 言語解説書

算術演算

算術演算を指定するには、下記のいずれかの演算子でオペランド同士を結び付けます。

  +    -    *    /    **

正符号 (+) と負符号 (-) は、接頭演算子として使うことも、挿入演算子として 使うこともできます。 これ以外のすべての算術演算子は、挿入演算子としてのみ使用することが できます (ADD、SUBTRACT、DIVIDE、および MULTIPLY 組み込み関数を使用して、 算術演算を使用することもできます)。

接頭演算子は、挿入演算子の任意のオペランドの前に付けることができ、 そのオペランドと関連があります。 例えば、A*-B という式の場合、負符号 (-) は A の値を B の値の -1 倍で乗じることを示しています。

1 つの変数に複数の接頭演算子を付けることができます。 正の接頭演算子を複数付けても、累積的な効果はありませんが、負の演算子を 2 つ続けると、正の接頭演算子を 1 つ使用するのと同じ結果になります。

算術演算におけるデータ変換

算術演算の 2 つのオペランドは、タイプ、基数、モード、精度、およびスケールの点で異なっていても構いません。 異なっているときは、以下で説明するように変換が行われます。 (コード化算術オペランドの場合は、表 13 を 使用して変換方法を判別することができます。 各オペランドは、計算結果のタイプ、基数、およびモードに変換されます。 計算結果の精度とスケールに変換する必要はありません。)

注:
スケールされる FIXED BINARY オペランドは、スケールされる FIXED DECIMAL に変換されてから、 それについての演算が行われます。
タイプ

文字オペランドは、FIXED DECIMAL(N,0) に変換されます。 ビット・オペランドは、FIXED BINARY(M,0) に変換されます。 (最大制限については、付録. 制限値を参照してください。)数字の文字オペランドは、ピクチャー指定によって決まるスケールと精度を持つ DECIMAL に変換されます。

グラフィックとワイド文字の変数とストリングは、 すべての計算コンテキストで使用することができます。 変換する必要があるときは、従うべき規則は、文字に対しても同様になります。

算術演算の結果は、常に、コード化算術フォーマットになります。 算術挿入演算子演算で行われる可能性のある変換は、タイプ変換だけです。

基数

2 つのオペランドの基数が異なっている場合は、10 進数オペランドが 2 進数に変換されます。

モード

2 つのオペランドのモードが異なっている場合は、実数オペランドが複素数モードに変換されます。これは、実数部分と同じ基数、スケール、および精度を与えて、虚数部分ゼロを設けるという方法で行われます。 ただし、累乗演算で第 2 オペランド (演算における指数) がスケール因数ゼロの固定小数点実数である場合は例外であり、 このときは変換は不要です。

精度

精度やスケール因数だけ (または両方) が異なっている場合は、タイプ変換は不要です。

スケール

2 つのオペランドのスケールが異なっている場合は、固定小数点オペランドが 浮動小数点のスケールに変換されます。 ただし、累乗演算で第 1 オペランドが浮動小数点のスケールになっており、第 2 オペランド (演算における指数) がスケール因数ゼロの固定小数点数、つまりは整数または精度 (p,0) として宣言された変数である場合は、例外です。 この場合は、変換は必要ではありませんが、結果は浮動小数点数になります。

累乗演算の両オペランドが固定小数点数である場合は、 次の変換方法のうちの 1 つが行われます。

算術演算の結果

式の中のオペランドが必要に応じて変換されたあと、算術演算が行われ、結果が出されます。 この結果は、式の値であることも、さらに後続の演算の対象となる中間結果であることもあります。あるいは、なんらかの条件が起こることもあります。

表 13表 14 は、 各種の算術演算から帰結する属性と精度を示しています。

表 18 は、表 13表 14 の 右端の欄に注記している累乗演算の特殊事例における結果の属性を示しています。

z/OS プラットフォームで浮動小数点の計算にどのセットの命令を使用するかは、次の 2 つのコンパイラー・オプションによって決まります。

したがって、FLOAT(NODFP) および DEFAULT(HEXADEC) オプションのもとでは、すべての計算は 16 進浮動小数点命令を使用して行われ、IEEE で宣言された変数は HEXADEC に変換されます。 一方、FLOAT(NODFP) および DEFAULT(IEEE) オプションのもとでは、すべての計算は、IEEE 2 進浮動小数点命令を使用して行われ、HEXADEC で宣言された変数は必要に応じて IEEE に変換されます。

その他すべてのプラットフォームでは、浮動小数点の計算は、そのプラットフォームに固有の IEEE 2 進浮動小数点命令を使用して行われます。

コンパイラー・オプション RULES(ANS) のもとでは、一方のオペランドが FIXED DECIMAL にスケールされており、他方のオペランドが FIXED BINARY にスケールされていると、FIXED BINARY 値は FIXED DECIMAL に変換されます。 表 15 は、コンパイラー・オプション RULES(ANS) のもとでの この場合の結果の属性および精度を示しています。 RULES コンパイラー・オプションの詳細については、「プログラミング・ガイド」を参照してください。

表 13. 1 つまたは複数の FLOAT オペランドの算術演算の結果
第 1
オペランド
(p1,q1)
第 2
オペランド
(p2,q2)
加算、減算、
乗算または
除算の結果
の属性
加算
または
減算
精度
乗算
精度
除算
精度
累乗演算の
結果の
属性
FLOAT
DECIMAL
(p1)
FLOAT
DECIMAL
(p2)
FLOAT
DECIMAL
(p)
p = MAX(p1,p2)
FLOAT
DECIMAL (p)
(特殊な場合以外は、
C が適用される)
p = MAX(p1,p2)
FLOAT
DECIMAL
(p1)
FLOAT
DECIMAL
(p2,q2)
FIXED
DECIMAL
(p1,q1)
FLOAT
DECIMAL
(p2)
FLOAT
BINARY
(p1)
FLOAT
BINARY
(p2)
FLOAT
BINARY
(p)
FLOAT
BINARY
(p)
(特殊な場合以外は、
C が適用される)
p = MAX(p1,p2)
FLOAT
BINARY
(p1)
FIXED
BINARY
(p2,q2)
FIXED
BINARY
(p1,q1)
FLOAT
BINARY
(p2,q2)
FIXED
DECIMAL
(p1,q1)
FLOAT
BINARY
(p2)
FLOAT
BINARY
(p)
p = MAX(
CEIL(p1*3.32),p2)
FLOAT
BINARY
(p)
(特殊な場合以外は、
A または C が
適用される)
p = MAX(
CEIL(p1*3.32),p2)
FLOAT
DECIMAL
(p1)
FLOAT
BINARY
(p1,q2)
FLOAT
DECIMAL
(p1)
FLOAT
BINARY
(p2)
FIXED
BINARY
(p1,q1)
FLOAT
DECIMAL
(p2)
FLOAT
BINARY
(p)
p = MAX(p1,CEIL(p2*3.32))
FLOAT
BINARY
(p)
(特殊な場合以外は、
B または C が
適用される)
p = MAX(
p1,CEIL(p2*3.32))
FLOAT
BINARY
(p1)
FIXED
DECIMAL
(p2,q2)
FLOAT
BINARY
(p1)
FLOAT
DECIMAL
(p2)
注:
  1. 累乗演算の特殊事例は、表 18 で説明しています。
  2. CEIL(N*3.32) 値の表については、表 22 を参照してください。
表 14. RULES(ANS) における、2 つのスケールのない FIXED オペランド間の算術演算の結果
第 1
オペランド
(p1,q1)
第 2
オペランド
(p2,q2)
加算、減算、
乗算または
除算の結果
の属性
加算
または
減算
精度
乗算
精度
除算
精度
累乗演算の
結果の
属性
FIXED
DECIMAL
(p1,0)
FIXED
DECIMAL
(p2,0)
FIXED
DECIMAL
(p,q)
p = 1
+MAX(p1,p2)
q = 0
p = 1
+p1+p2
q = 0
p = N
q = N-p1
FLOAT DECIMAL (p)
(特殊な場合以外は、
A が適用される)
p = MAX(p1,p2)
FIXED
BINARY
(p1,0)
FIXED
BINARY
(p2,0)
FIXED
BINARY
(p,0)
p = 1
+MAX(p1-q1,
p2-q2) +q
q = 0
p = 1+p1
    +p2
q = 0
p = M
q = 0
FLOAT BINARY (p)
(特殊な場合以外は、
B が適用される)
p = MAX(p1,p2)
FIXED
DECIMAL
(p1,0)
FIXED
BINARY
(p2,0)
FIXED
BINARY
(p,0)
p = 1
+MAX(r,p2)
q = 0
p = 1
+r+p2
q = 0
p = M
q = 0
FLOAT BINARY (p)
(特殊な場合以外は、
A が適用される)
p = MAX(CEIL
(p1*3.32 ),p2)
FIXED
BINARY
(p1,0)
FIXED
DECIMAL
(p2,0)
FIXED
BINARY
(p,0)
p = 1
+MAX(p1,t)
q = 0
p = 1
+p1+t
q = 0
p = M
q = 0
FLOAT BINARY (p)
(特殊な場合以外は、
B が適用される)
p = MAX(CEIL
(p1*3.32 ),p2)
M は FIXED BINARY の最大精度です。
N は FIXED DECIMAL の最大精度です。
r = 1 + CEIL(p1*3.32)
s = CEIL(ABS(q1*3.32)) * SIGN(q1)
t = 1 + CEIL(p2*3.32)
u = CEIL(ABS(q2*3.32)) * SIGN(q2)
v = CEIL(p2/3.32)
w = CEIL(p1/3.32)
注:

スケール因数は、-128 から +127 の範囲内になければなりません。

  1. 累乗演算の特殊事例は、表 18 で説明しています。
  2. CEIL(N*3.32) 値の表については、表 22 を参照してください。
  3. RULES(ANS) においては、 スケールのない FIXED オペランドを持つ除算は、 両方のオペランドが FIXED DECIMAL の場合にのみ スケールのある結果を生じます。
表 15. RULES(ANS) における、2 つのスケールされた FIXED オペランド間の算術演算の結果
第 1
オペランド
(p1,q1)
第 2
オペランド
(p2,q2)
加算、減算、
乗算または
除算の結果
の属性
加算
または
減算
精度
乗算
精度
除算
精度
累乗演算の
結果の
属性
FIXED
DECIMAL
(p1,q1)
FIXED
DECIMAL
(p2,q2)
FIXED
DECIMAL
(p,q)
p = 1 +
MAX(p1-q1,
p2-q2) +q
q =
MAX(q1,q2)
p = 1
+p1+p2
q =
  q1+q2
p = N
q =
N-p1+q1-q2
FLOAT DECIMAL (p)
(特殊な場合以外は、
A が適用される)
p = MAX(p1,p2)
FIXED
DECIMAL
(p1,q1)
FIXED
BINARY
(p2,0)
FIXED
DECIMAL
(p,q)
p = 1
+MAX(p1-
q1,v) +q
q = q1
p = 1
+p2+v
q = q1
p = N
q = N-q1
FLOAT BINARY (p)
(特殊な場合以外は、
A が適用される)
p = MAX(CEIL
(p1*3.32 ),p2)
FIXED
BINARY
(p1,0)
FIXED
DECIMAL
(p2,q2)
FIXED
DECIMAL
(p,q)
p = 1
+MAX(p2-
q2,w) +q
q = q2
p = 1
+p2+w
q = q1
p = N
q = N-q2
FLOAT BINARY (p)
(特殊な場合以外は、
B が適用される)
p = MAX(CEIL
(p1*3.32 ),p2)
M は FIXED BINARY の最大精度です。
N は FIXED DECIMAL の最大精度です。
r = 1 + CEIL(p1*3.32)
s = CEIL(ABS(q1*3.32)) * SIGN(q1)
t = 1 + CEIL(p2*3.32)
u = CEIL(ABS(q2*3.32)) * SIGN(q2)
v = CEIL(p2/3.32)
w = CEIL(p1/3.32)
注:

スケール因数は、-128 から +127 の範囲内になければなりません。

  1. 累乗演算の特殊事例は、表 18 で説明しています。
  2. CEIL(N*3.32) 値の表については、表 22 を参照してください。
  3. RULES(ANS) のもとでは、スケールされた FIXED BINARY は使用できません。
表 16. RULES(IBM) における、2 つの FIXED オペランド間の算術演算の結果
第 1
オペランド
(p1,q1)
第 2
オペランド
(p2,q2)
加算、減算、
乗算または
除算の結果
の属性
加算
または
減算
精度
乗算
精度
除算
精度
累乗演算の
結果の
属性
FIXED
DECIMAL
(p1,q1)
FIXED
DECIMAL
(p2,q2)
FIXED
DECIMAL
(p,q)
p = 1
+MAX(p1-q1,
p2-q2) +q
q =
MAX(q1,q2)
p = 1
+p1+p2
q =
  q1+q2
p = N
q =
N-p1+q1-q2
FLOAT DECIMAL (p)
(特殊な場合以外は、
A が適用される)
p = MAX(p1,p2)
FIXED
BINARY
(p1,q1)
FIXED
BINARY
(p2,q2)
FIXED
BINARY
(p,q)
p = 1
+MAX(p1-q1,
p2-q2) +q
q =
MAX(q1,q2)
p = 1
+p1+p2
q = q1+q2
p = M
q = M-p1
+q1-q2
FLOAT BINARY (p)
(特殊な場合以外は、
B が適用される)
p = MAX(p1,p2)
FIXED
DECIMAL
(p1,q1)
FIXED
BINARY
(p2,q2)
FIXED
BINARY
(p,q)
p = 1
+MAX(r-s,
p2-q2)+q
q =
MAX(s,q2)
p = 1+r
+p2
q = s+q2
p = M
q = M-r
+s-q2
FLOAT BINARY (p)
(特殊な場合以外は、
A が適用される)
p =MAX(
CEIL((p1*3.32 ),p2)
FIXED
BINARY
(p1,q1)
FIXED
DECIMAL
(p2,q2)
FIXED
BINARY
(p,q)
p = 1
+MAX(p1-
q1,t-u) +q
q =
MAX(s,q1,u)
p = 1
+p1+t
q = q1+u
p = M
q = M-p1
+q1-u
FLOAT BINARY (p)
(特殊な場合以外は、
B が適用される)
p = MAX(p1,CEIL(
p2*3.32))
M は FIXED BINARY の最大精度です。
N は FIXED DECIMAL の最大精度です。
r = 1 + CEIL(p1*3.32)
s = CEIL(ABS(q1*3.32)) * SIGN(q1)
t = 1 + CEIL(p2*3.32)
u = CEIL(ABS(q2*3.32)) * SIGN(q2)
v = CEIL(p2/3.32)
w = CEIL(p1/3.32)
注:

スケール因数は、-128 から +127 の範囲内になければなりません。

  1. 累乗演算の特殊事例は、表 18 で説明しています。
  2. CEIL(N*3.32) 値の表については、表 22 を参照してください。

次の式を例に、考えてみましょう。

  A * B + C

まず、演算 A * B が行われ、中間結果が生じます。 次に、(中間結果) + C という演算が行われて、式の値が求められます。

PL/I は、属性を別の変数に指定するのと同じ方法で 中間結果属性を指定します。 結果の属性は、2 つのオペランドの属性 (または接頭部演算の場合には 単一オペランド)、および関係する演算子から派生します。 結果の属性を求める方法については、ターゲットに説明されています。

組み込み関数 ADD、SUBTRACT、MULTIPLY、および DIVIDE を使用すると、加算、 減算、乗算、および除算演算に関してインプリメンテーションで定められている 精度の規則を無効にすることができます。

FIXED 除算

固定小数点除算を行うと、オーバーフローや切り捨てが起こることがあります。 例えば次の場合、

  25+1/3

固定小数点除算の結果が、インプリメンテーションで定義されている最大精度の 値になるため、式の計算結果は未定義となり、FIXEDOVERFLOW 条件が起こります。

ただし次の場合、

  25+01/3

定数には作成される精度があるので、 式は 25.3333333333333 (最大精度は 15) という結果になります。 2 つの計算の結果は、表 17 に示されている結果になります。

表 17. 固定小数点除算と定数式の比較
項目
精度
結果
1
3
1/3
25
  25+1/3
(1,0)
(1,0)
(15,14)
(2,0)
(15,14)
1
3
0.33333333333333
25
未定義
(左方で切り捨て。
最大精度が 15 の場合は、
FIXEDOVERFLOW が生じる)
01
3
01/3
25
  25+01/3
(2,0)
(1,0)
(15,13)
(2,0)
(15,13)
01
3
00.3333333333333
25
25.3333333333333

PRECISION 組み込み関数を使用することもできます。 以下に例を示します。

  25+prec(1/3,15,13)
注:
正確な精度が必要な状況では、名前のついた定数をお勧めします。

累乗演算の使用

以下の表は、PL/I で累乗演算が扱われる方法を説明しています。

表 18. 累乗演算の特殊事例
事例
第 1 オペランド
第 2 オペランド
結果の属性
  A
FIXED
DECIMAL
(p1,q1)
値が n の整数
FIXED DECIMAL (p,q)
(p <= N)
ただし、p = (p1 + 1)*n-1
かつ q = q1*n
B
FIXED BINARY
(p1,q1)
値が n の整数
FIXED BINARY (p,q)
  (p <= M)
  ただし、p = (p1 + 1)*n-1
  かつ q = q1*n
  C
FLOAT (p1)
FIXED (p2,0)
FLOAT (p1)
基数は第 1 オペランドの基数と
同じ
実モードまたは複素数モードでの x**y の特殊事例:
実モード:
複素数モード:
x=0 かつ y>0
結果は 0。x=0、かつ y の実数部分 >0 かつ y の虚数部分 =0 ならば、 結果は 0。
x=0 かつ y<=0
ERROR 条件が起こる。 x=0 かつ y の実数部分 <=0 または y の虚数部分 ¬=0 ならば、 ERROR 条件が起こる。
x<0 かつ y が FIXED (p,0) でないとき
ERROR 条件が起こる。 x¬=0 かつ y の実数部分および虚数部分 =0 ならば、結果は 1。

Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)