ILE COBOL 解説書


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

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

最初に、コンパイラーは、ir を生成するために使用されるオペランドのそれぞれに数字を割り当て、 演算から得られる値を判別することにより、ir に入る可能性のある最大値を判別します。

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

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

表 42. 中間結果の精度の判別

演算 整数桁の数 小数桁の数
+ または - (i1 または i2) + 1 のいずれか大きい方 d1 または d2 のいずれか大きい方
* i1 + i2 d1 + d2
/ i1 + d2 (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. これらの結果はそれ以降の処理の対象となります。

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

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

表 43. コンパイラーが中間結果の切り捨てを行う時期の判別

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 拡張----------------------------------+

    • (デフォルト) コンパイラー・オプション *NOEXTEND または PROCESS ステートメント・オプション NOEXTEND が指定されているときには、10 進数の 30。
    • 算術計算モード・コンパイラー・オプション *EXTEND31 または PROCESS ステートメント・オプション EXTEND31 が指定されている場合、10 進数の 31。
    • 算術計算モード・コンパイラー・オプション *EXTEND63 または PROCESS ステートメ ント・オプション EXTEND63 が指定されているときには、10 進数の 63。

      +------------------------------End of IBM 拡張-------------------------------+

  2. i + d の値が MAXLENGTH よりも小さい偶数である場合、 コンパイラーは 1 を加算することによってそれを奇数に変換します。

  3. i + d の値が 63 を超える場合は、ステートメントに SIZE ERROR 句が 含まれていても、システム・メッセージ MCH1202 が出されることがあります。

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

関連情報


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]