FIXEDOVERFLOW 条件

FIXED DECIMAL の結果の長さが許容される最大長を超えていることを示す計算条件です。

有効/無効の状態

常に有効です。

結果

FIXEDOVERFLOW ON unit が存在しない場合は ERROR に引き上げられ、それ以外の場合は不定です。

発生

結果がコンピューター/実装で許容される最大値を超えた場合に発生します。これは -fdmaxp コンパイラ オプションで制御されます。

FIXEDOVERFLOW は、指定された P,Q 引数の中間結果がユーザー指定の P,Q を超える組み込み関数に対しても発生します。

制約事項

  • NOFIXEDOVERFLOW プレフィックス条件のサポートなし。
  • -prefix NOFIXEDOVERFLOW のサポートなし。
  • ONCONDID() の値。ON ERROR から照会されると、エラーではなく、FIXEDOVERFLOW または SIZE などの基本的な状態を反映します。
  • Open PL/I は、FIXED DECIMAL 変数への割り当て時に FIXEDOVERFLOW を起動する操作に対するメインフレーム PL/I の「未定義の動作」と一致しません。
  • -decimal forceodd (デフォルト) と -decimal noforceodd でコンパイルされるプロシージャを同じアプリケーション内で組み合わせるか照合する場合、偶数精度で宣言されたすべての FIXED DECIMAL 変数のデータが正しくマーシャリングされることを自分で確認する必要があります。
    重要: FIXED DECIMAL 変数を偶数精度で宣言しないことを強くお勧めします。

エミュレートされた FIXED DECIMAL 演算
Open PL/I が実行されるハードウェアでは PACKED 操作はサポートされず、FIXED DECIMAL 演算は生成コードとライブラリの呼び出しの組み合わせによってエミュレートされます。可能な場合、Open PL/I は、代入または式 (あるいはその両方) の結果で FIXED DECIMAL 変数または中間式の精度のオーバーフローが発生する状況を検出し、FIXEDOVERFLOW 条件を発生させます。
FIXED DECIMAL 変数
偶数精度を指定する FIXED DECIMAL 変数について、Enterprise Developer 8.0 Patch Update 2 のデフォルトの動作では、定義された精度で必ずしも必要でない場合でも追加の上位ニブルが使用されます。
注: Enterprise Developer 7.0 以前の動作に戻すには、-decimal noforceodd コンパイラ指令を指定します。
メインフレーム PL/I との動作の違い
  • プログラムの変数に初期化の結果 FIXEDOVERFLOW を発生させるものがある場合、メインフレーム PL/I は S レベルの診断を生成し、オブジェクト コードを作成しません。Enterprise Developer は、E レベルの診断を生成し、オブジェクト コードを作成します。作成されたプログラムは、ルーチンのプロローグ コードに入った直後に FIXEDOVERFLOW を起動します。コンパイラ メッセージ出口を使用して、この動作を S レベルの診断に変更できます。
FIXEDOVERFLOW についての IBM の定義された動作と実際の動作の不一致
次の表に、IBM の言語リファレンス マニュアル (LRM) に記載されている動作のうち、実際には記載されている動作と異なるものを示します。各エントリについて、実際の IBM の動作と Enterprise Developer の動作を示しています。
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 の定義された動作と実際の動作の不一致」セクションで説明されているシナリオを示しています。

例 1
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);
例 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));
例 3
    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 */
例 4
    DCL DEC1 DEC FIXED(7,2);
    DCL BIN1 FIXED BIN(31) init(998);     

    DEC1 = FIXED(BIN1 + 2.5, 5, 2);
例 5
    DCL DEC1 DEC FIXED(7,2) init(998.5);
    DCL BIN1 FIXED BIN(31); 
     
    BIN1 = FIXEDBIN(DEC1 + 2.5, 3, 0);
例 6
    DCL DEC1 DEC FIXED(7,2);
    DCL BIN1 FIXED BIN(31) init(998); 
     
    DEC1 = PRECISION(BIN1 + 2.5, 5, 2);

その他の情報

省略形
FOFL
条件コード
310
暗黙の処理
メッセージを出力し、ERROR 条件を発生させます。
通常の復帰
条件が発生した直後の時点に制御が戻ります。