ILE COBOL 解説書
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 に含まれる小数桁の数は次のように計算されます。
表 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。
リテラル
|
注:
- これらの結果はそれ以降の処理の対象となります。
|
最終結果で希望する精度を得るためには、任意の算術ステートメントのオペランドを十分な小数桁で定義しなければなりません。
表 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 用に確保されます。
|
注:
- MAXLENGTH は次のいずれかの値です。
- i + d の値が MAXLENGTH よりも小さい偶数である場合、 コンパイラーは 1
を加算することによってそれを奇数に変換します。
- i + d の値が 63 を超える場合は、ステートメントに SIZE ERROR 句が
含まれていても、システム・メッセージ MCH1202 が出されることがあります。
|
中間結果フィールドが MAXLENGTH 桁を超える可能性があると考えられる場合には、
浮動小数点オペランド (COMP-1 および COMP-2)
を使用して、切り捨てを避けることができます。
関連情報
[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]