コンパイラーによる中間結果の計算

ir の中の整数桁の数は、 次のように計算されます。

最初に、コンパイラーは、ir を生成するために使用されるオペランドのそれぞれに数字を割り当て、 演算から得られる値を判別することにより、ir に入る可能性のある最大値を判別します。
  • このステートメントのオペランドがデータ名の場合、 そのデータ名に使用される値はそのデータ名の PICTURE の数字と等しくなります (すなわち、PICTURE 9V99 は値 9.99 をもちます)。
  • オペランドがリテラルの場合、 そのリテラルは PICTURE をもっているかのように取り扱われ、PICTURE の数字が使用されます (すなわち、 リテラル +127.3 は暗黙の PICTURE S999V9 をもっています)。
  • オペランドが中間結果の場合、前の演算で中間結果用に判別された PICTURE が使用されます。 その PICTURE の数字が使用されます。
  • 演算が除算である場合は、
    • op2 がデータ名である場合、op2 に使用される値は、 そのデータ名の PICTURE 内の桁のゼロでない最小値となります (すなわち、PICTURE 9V99 は値 0.01 をもちます)。
    • op2 が中間結果である場合、 その中間結果は PICTURE をもっているかのように取り扱われ、この PICTURE 内の桁のゼロでない最小値が使用されます。

上記のプロシージャーによって ir の最大値が判別されると、i は最大値の中の整数桁の数と等しく設定されます。

ir に含まれる小数桁の数は次のように計算されます。

表 1. 中間結果の精度の判別
演算 整数桁の数 小数桁の数
+ または - (i1 または i2) + 1 のいずれか大きい方 d1 または d2 のいずれか大きい方
* i1 + i2 d1 + d2
/ i2 + d1 (d2 - d1) または dmax のいずれか大きい方
**

i2 が 0 と等
しい場合

     max(min(i1,18),1)
     (op2 が非整数の場合)1
     max(min(i1 * i1,18),1)
     (op2 が整数リテラルの場合)1
i2 が 0 と等
しくない場合

     max(min(i1 * (9 * i2),18),1)
     (op2 が非整数の場合)1
     max(min(i1 * i1 * (9 * i2),18),1)
     (op2 が整数リテラルの場合)1

op2 が非整数またはデータ名で
あれば、dmax

op2 が整数リテラルであれば d1 * op2

注:
  1. これらの結果はそれ以降の処理の対象となります。

最終結果で希望する精度を得るためには、任意の算術ステートメントのオペランドを十分な小数桁で定義しなければなりません。

表 2 は、固定小数点数の中間結果を処理するときのコンパイラーの処置を示します。

表 2. コンパイラーが中間結果の切り捨てを行う時期の判別
i + d2 の値 d の値 i + dmax の値 処置

< MAXLENGTH1
= MAXLENGTH

任意の値 任意の値 整数桁 i と 少数桁 d が ir 用に確保されます。
> MAXLENGTH3

< dmax
= dmax

任意の値 MAXLENGTH - d 整数桁と d 小数桁が ir 用に確保されます。
> dmax

< MAXLENGTH
= MAXLENGTH

i 整数桁と MAXLENGTH - i 小数桁が ir 用に確保されます。
> MAXLENGTH MAXLENGTH - dmax 整数桁と dmax 小数桁が ir 用に確保されます。
注:
  1. MAXLENGTH は次のいずれかの値です。
    • 10 進数の 18
    IBM Extension
    IBM Extension
    • (デフォルト) コンパイラー・オプション *NOEXTEND または PROCESS ステートメント・オプション NOEXTEND が指定されているときには、10 進数の 30。
    • 算術計算モード・コンパイラー・オプション *EXTEND31 または PROCESS ステートメント・オプション EXTEND31 が指定されている場合、10 進数の 31。
    • 変更の始まり算術計算モード・コンパイラー・オプション *EXTEND31FULL または PROCESS ステートメント・オプション EXTEND31FULL が指定されている場合、10 進数の 34。変更の終わり
    • 算術計算モード・コンパイラー・オプション *EXTEND63 または PROCESS ステートメ ント・オプション EXTEND63 が指定されているときには、10 進数の 63。
    End of IBM Extension
    End of IBM Extension
  2. i + d の値が MAXLENGTH よりも小さい偶数である場合、 コンパイラーは 1 を加算することによってそれを奇数に変換します。
  3. i + d の値が 63 を超える場合は、ステートメントに SIZE ERROR 句が 含まれていても、システム・メッセージ MCH1202 が出されることがあります。

中間結果フィールドが MAXLENGTH 桁を超える可能性があると考えられる場合には、 浮動小数点オペランド (COMP-1 および COMP-2) を使用して、切り捨てを避けることができます。