5.2.4 演算の中間結果
なお,Linux(x64)の場合,数字項目のけた拡張機能での演算の中間結果については,「28.3 数字項目のけた拡張機能での演算の中間結果」を参照してください。
-
演算の結果,上位けたや下位けたに切り捨てが発生しないけた数を確保します。
-
除算の場合,割り切れるとは限らないので,小数部のけた数は算術文中に現れる項目の最大のものとします。
除数のPICTURE句で,999PPVのように小数点の左側にPがある場合には,演算速度の効率を考慮して,Pのけた数を商の中間結果に加えて大きくします。
ここで確保されないけたに入る値は,切り捨てられます。
-
べき乗の場合(右辺(べき数)が一意名のとき),演算結果の上位けたや下位けたがどこまで大きくなるかわからないため,中間結果を30けたとして,小数部のけた数は算術式中に現れる項目の小数部の最大値とします。
ここで確保されないけたに入る値は,切り捨てられます。
-
中間結果の取れるけた数は,最大の30けたとし,これを超えた場合は補正をします。
このシステムで適用する中間結果の計算式を「表5‒2 中間結果のけた数(加減算)」および「表5‒3 中間結果のけた数(乗算,除算,べき乗)」に示します。ただし,作用対象に数字定数がある場合,中間結果はその計算結果の取れる最大値を格納できるけた数を確保します。
表5‒2 中間結果のけた数(加減算) 演算の種類
整数部のけた数
小数部のけた数
加減算が連続(a1±a2±...±an)していて,かつ整数けたが最大9けた以下の場合
Max(I1,I2,…,In) + i※
MAX(Dn-1,Dn)
上記以外の場合
Max(In-1,In) + 1
- (凡例)
-
I1:連続する加減算の最初の数の整数部のけた数
In-1:演算の左辺の整数部のけた数
Dn-1:演算の左辺の小数部のけた数
In:演算の右辺の整数部のけた数
Dn:演算の右辺の小数部のけた数
- 注※
-
iは,次に示す式を満足する整数を表します。
log10(n) ≦ i ≦ log10(n-1) + 1
iを加算することで,中間結果の整数部のけた数が9けたを超えた場合,整数部のけた数の算出方法が「上記以外の場合」に変わります。
表5‒3 中間結果のけた数(乗算,除算,べき乗) 演算の種類
整数部のけた数(I)
小数部のけた数(D)
乗算
I1 + I2
D1 + D2
除算
I1 + D2
MAX (D1 - D2,Dmax)
べき乗
- 右辺が整数の数字直定数(L≠0)のとき
-
I1 × L
- 右辺が整数の数字直定数 (L=0)のとき
-
1
- 右辺が上記以外のとき
-
30 - Dmax
- 右辺が整数の数字直定数(L≠0)のとき
-
D1 × L
- 右辺が整数の数字直定数(L=0)のとき
-
0
- 右辺が上記以外のとき
-
Dmax
- (凡例)
-
I:中間結果の整数部のけた数
D:中間結果の小数部のけた数
I1:演算の左辺の整数部のけた数
D1:演算の左辺の小数部のけた数
I2:演算の右辺の整数部のけた数
D2:演算の右辺の小数部のけた数
Df:受け取り側作用対象の小数部のけた数
Dmax:算術式中のすべての作用対象と結果項目(ROUNDED指定ありの場合はDf + 1)の中で最大の小数部のけた数(算術式が条件式中に書かれたときは比較の作用対象を含む。また,べき数と除数の作用対象と浮動小数点数のものは除く。)
MAX(x,y):xとyの最大数
L:整数の数字直定数の値
表5‒4 中間結果が30けたを超える場合の補正値 補正条件
最終的な整数部
最終的な小数部
Dの値
Iの値
D ≦ Dmax
(任意)
30 - D
D
D > Dmax
I + Dmax ≦ 30
I
30 - I
I + Dmax > 30
30 - Dmax
Dmax
- 注
-
表中のIとDは,「表5‒3 中間結果のけた数(乗算,除算,べき乗)」で計算された値です。
-
PICTURE句で整数部にPの指定がある場合,小数部のけた数は0として計算します。小数部にPの指定がある場合は,整数部は負として計算します。例えば,999PPVの整数部のけた数は5で,小数部のけた数は0です。また,中間結果のけた数(I + D)が30けたを超えた場合,「表5‒2 中間結果のけた数(加減算)」と「表5‒3 中間結果のけた数(乗算,除算,べき乗)」の値は,「表5‒4 中間結果が30けたを超える場合の補正値」のように補正されます。
演算の中間結果のけた数を求める例を次に示します。
- (例)
77 A PIC S9(3)V9(3). 77 B PIC S9(4)V9(3). 77 C PIC S9(3)V9(2). 77 D PIC S9(7)V9(4). : COMPUTE D = C + (A / B).
上記のCOMPUTE文を実行すると,中間結果のけた数は次のようになります。
- 除算A/Bの中間結果のけた数
-
整数部:I=I1+D2=3+3=6(けた)
小数部:D=MAX(D1-D2,Dmax)=MAX(0,4)=4(けた)
- 加算C+(A/B)の中間結果のけた数
-
除算A/Bの中間結果のけた数は,上記の計算式から,I2=6,D2=4として計算します。
整数部:I=MAX(I1,I2)+1=MAX(3,6)+1=7(けた)
小数部:D=MAX(D1,D2)=MAX(2,4)=4(けた)
- 演算の中間結果についての注意事項
-
-
次の場合,浮動小数点演算となるため,中間結果のけた数の計算式は適用されません。
-
浮動小数点項目や浮動小数点数字定数が算術演算の対象に指定されている場合
-
被べき数(底)が浮動小数点項目であるか,またはべき数(指数)が整数でない場合
-
関数値のデータ属性が内部浮動小数点形式の組み込み関数の場合
-
浮動小数点項目,べき乗が含まれる算術式,または除算が含まれる算術式を引数に指定した組み込み関数の場合
-
中間結果が30けたを超えると,切り捨てが行われるため,正しい値が求まらないことがあります。そのため,中間結果が30けたを超える計算をしてはいけません。
-
中間結果の計算式は,COBOLの規格で規定されていないため,このシステムが独自に規定したものです。
-