常に有効です。
FIXEDOVERFLOW ON unit が存在しない場合は ERROR に引き上げられ、それ以外の場合は不定です。
結果がコンピューター/実装で許容される最大値を超えた場合に発生します。これは -fdmaxp コンパイラ オプションで制御されます。
FIXEDOVERFLOW は、指定された P,Q 引数の中間結果がユーザー指定の P,Q を超える組み込み関数に対しても発生します。
| IBM LRM に記載された動作 | 実際の IBM の動作 | Enterprise Developer の動作 |
|---|---|---|
| FIXED DECIMAL 変数 (または式) の MAXVAL() および PRECVAL() 組み込み関数は、偶数精度の変数の実際の状態を反映します。 | FIXED DECIMAL 変数 (または式) の MAXVAL() および PRECVAL() 組み込み関数は、偶数精度の変数の実際の状態を反映しません。たとえば、FIXED DECIMAL(4,0) 変数を宣言し、10000 から 99999 までの値を含む FIXED BIN(31) の値を割り当てた場合、変数の参照時には割り当てた値が含まれますが、MAXVAL は 9999 を返し、PRECVAL は 4 を返します。 | 実際の IBM の動作と一致します。 |
| MULTIPLY 組み込み関数は、MULTIPLY と割り当て (FOFLONASGN) に対して 1 つずつ、FIXEDOVERFLOW 条件を 2 つ生成します。下記の例 1 を参照してください。 | MULTIPLY 組み込み関数は、FIXEDOVERFLOW 条件を 1 つだけ生成します。 | IBM LRM と一致します。 |
| z/OS で等しい P,Q 値を持つ 2 つの FIXED DECIMAL 変数のネイティブの加算を実行したときに、FIXEDOVERFLOW が生成されます。下記の例 2 を参照してください。 | z/OS で等しい P,Q 値を持つ 2 つの FIXED DECIMAL 変数のネイティブの加算を実行したときに、FIXEDOVERFLOW は生成されません。 | IBM LRM と一致します。 |
| 発生させることを意図した式が最初の引数で指定されている場合、BINARY 組み込み関数で FIXEDOVERFLOW が発生します。下記の例 3 を参照してください。 | 発生させることを意図した式が最初の引数で指定されている場合でも、P,Q 引数を省略しない限り BINARY 組み込み関数で FIXEDOVERFLOW は発生しません。 | IBM LRM と一致します。 |
| 発生させることを意図した式の引数が指定されている場合、FIXED 組み込み関数で FIXEDOVERFLOW が発生します。下記の例 4 を参照してください。 | 発生させることを意図した式の引数が指定されている場合でも、FIXED 組み込み関数で FIXEDOVERFLOW は発生しません。 | IBM LRM と一致します。 |
| 発生させることを意図した式の引数が指定されている場合、FIXEDBIN 組み込み関数で FIXEDOVERFLOW が発生します。下記の例 5 を参照してください。 | 発生させることを意図した式の引数が指定されている場合でも、FIXEDBIN 組み込み関数で FIXEDOVERFLOW は発生せず、正しくない結果になります。 | このシナリオでは FIXEDOVERFLOW は発生しませんが、正しい結果が得られます。 |
| 発生させることを意図した式の引数が指定されている場合、PRECISION 組み込み関数で FIXEDOVERFLOW が発生します。下記の例 6 を参照してください。 | 発生させることを意図した式の引数が指定されている場合でも、PRECISION 組み込み関数で FIXEDOVERFLOW は発生しません。 | IBM LRM と一致します。 |
| FIXED DECIMAL(4,0) 変数の割り当て時の FIXED BIN(31) への変換で、最大値は FIXED BIN(14) と等しくなります。IBM 5.3 LRMの 76 ページにある表 35 を参照してください。 | FIXED DECIMAL(4,0) 変数の割り当て時の FIXED BIN(31) への変換で、最大値は実際には FIXED BIN(31) と等しくなります。 | 実際の IBM の動作と一致します。 |
次の例は、上記の「FIXEDOVERFLOW についての IBM の定義された動作と実際の動作の不一致」セクションで説明されているシナリオを示しています。
DCL DEC1 DEC FIXED(5,2) init(999); DCL DEC2 DEC FIXED(5,2) init(112); DCL DEC3 DEC FIXED(5,2); /* 111888 - result overflows 7,2 giving 11888 */ /* 11888 - intermediate result overflows 5,2 on assignment */ /* IBM only generates 1 FIXEDOVERFLOW contradicting what */ /* LRM and Programming guide state for FOFLONASGN and FOFLONMULT */ DEC3 = MULTIPLY(DEC1, DEC2, 7, 2);
DCL DEC1 DEC FIXED(4,2);
DCL DEC2 DEC FIXED(4,2);
DCL DEC3 DEC FIXED(7,2);
dcl TOOBIG DEC FIXED(5,2) init(999);
DEC1 = 1;
DEC2 = TOOBIG; /* shouldn't be possible - demonstrates IBM behavior */
put skip data(dec2);
put skip list('hex(dec2): ' || hex(dec2));
dec3 = DEC1 + DEC2; /* We generate FIXEDOVERFLOW - IBM DOES NOT */
put skip list('hex(dec3): ' || hex(dec3));
DCL DEC1 DEC FIXED(5,2) init(1);
DCL DEC2 DEC FIXED(5,2) init(999);
DCL BIN1 FIXED BIN(31);
BIN1 = BINARY(DEC1 + DEC2, 3, 0); /* IBM
does not generate FIXEDOVERFLOW */
DCL DEC1 DEC FIXED(7,2);
DCL BIN1 FIXED BIN(31) init(998);
DEC1 = FIXED(BIN1 + 2.5, 5, 2);
DCL DEC1 DEC FIXED(7,2) init(998.5);
DCL BIN1 FIXED BIN(31);
BIN1 = FIXEDBIN(DEC1 + 2.5, 3, 0);
DCL DEC1 DEC FIXED(7,2);
DCL BIN1 FIXED BIN(31) init(998);
DEC1 = PRECISION(BIN1 + 2.5, 5, 2);