コンパイラーによる中間結果の計算
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 に含まれる小数桁の数は次のように計算されます。
| 演算 | 整数桁の数 | 小数桁の数 |
|---|---|---|
| + または - | (i1 または i2) + 1 のいずれか大きい方 | d1 または d2 のいずれか大きい方 |
| * | i1 + i2 | d1 + d2 |
| / | i2 + d1 | (d2 - d1) または dmax のいずれか大きい方 |
| ** | i2 が 0 と等 |
op2 が非整数またはデータ名で |
| 注:
|
||
最終結果で希望する精度を得るためには、任意の算術ステートメントのオペランドを十分な小数桁で定義しなければなりません。
表 2 は、固定小数点数の中間結果を処理するときのコンパイラーの処置を示します。
| i + d2 の値 | d の値 | i + dmax の値 | 処置 |
|---|---|---|---|
| < MAXLENGTH1 |
任意の値 | 任意の値 | 整数桁 i と 少数桁 d が ir 用に確保されます。 |
| > MAXLENGTH3 | < dmax |
任意の値 | MAXLENGTH - d 整数桁と d 小数桁が ir 用に確保されます。 |
| > dmax | < MAXLENGTH |
i 整数桁と MAXLENGTH - i 小数桁が ir 用に確保されます。 | |
| > MAXLENGTH | MAXLENGTH - dmax 整数桁と dmax 小数桁が ir 用に確保されます。 | ||
| 注:
|
|||
中間結果フィールドが MAXLENGTH 桁を超える可能性があると考えられる場合には、 浮動小数点オペランド (COMP-1 および COMP-2) を使用して、切り捨てを避けることができます。
関連情報
算術計算モード・コンパイラー・オプション *EXTEND31FULL または PROCESS ステートメント・オプション EXTEND31FULL が指定されている場合、10 進数の 34。