*MINVAL
|
([ (IR =result-format/length)] operand,...)
|
||
*MAXVAL
|
フォーマット/長さ:フォーマットおよび長さは、IR
節を使用して明示的に指定するか、後述のフォーマット/長さの変換規則表を使用して自動的に評価できます。
このドキュメントでは、次のトピックについて説明します。
*MINVAL
/*MAXVAL
システム関数は、指定されたすべてのオペランド値の最小値/最大値を評価します。 結果は常にスカラー値です。 オペランドとして配列が指定された場合、すべての配列フィールドの最小/最大が評価されます。
*MINVAL
/*MAXVAL
システム関数は、*MINVAL
/*MAXVAL
が許可されるステートメントの任意の位置にオペランドとして指定できます。 ただし、ターゲット変数が予期される位置に *MINVAL
/*MAXVAL
を使用しないでください。
*MINVAL
/*MAXVAL
は、システム関数でネストすることはできません。
英字データまたはバイナリデータを引数として使用するとき、データが同一であれば(例えば、*MINVAL('AB','AB')
)、結果は最小/最大の長さを持つ引数になります。
オペランド | 構文要素 | フォーマット | ステートメント参照 | ダイナミック定義 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand | C | S | A | G | A | U | N | P | I | F | B | D | T | 可 | 不可 |
構文要素の説明:
*MINVAL | 指定されたすべてのオペランド値の最小値を評価します。 |
---|---|
*MAXVAL | 指定されたすべてのオペランド値の最大値を評価します。 |
operand | *MINVAL /*MAXVAL システム関数で最小値/最大値が評価されるオペランドです。
|
result-format-length | 結果のフォーマット/長さを明示的に指定するための中間結果節です。 下記の「IR 節」を参照してください。 |
IR
(中間結果)節は、*MINVAL
/*MAXVAL
システム関数全体の result-format/length を明示的に指定するために使用できます。
IR=result-format/length
IR=
|
format-length | ||||||
(
|
|
) DYNAMIC
|
結果のフォーマット/長さの有効な組み合わせについては、後述のフォーマット/長さの変換規則表を参照してください。
構文要素の説明:
例:
DEFINE DATA LOCAL 1 #RESULTI (I4) 1 #RESULTA (A20) 1 #RESULTADYN (A) DYNAMIC 1 #A(I4) CONST <1234> 1 #B(A20) CONST <H'30313233'> /* '0123' stored 1 #C(I2/1:3) CONST <2000, 2100, 2200> END-DEFINE * #RESULTA := *MAXVAL((IR=A20) #A, #B) /*no error, I4->A20 is allowed! #RESULTADYN := *MAXVAL((IR=(A)DYNAMIC) #A, #B) /*result is (A) dynamic /* #RESULTI := *MAXVAL((IR=I4) #A, #B) /*compiler error, because conv. A20->I4 is not allowed! #RESULTI := *MAXVAL((IR=I4) #A, #C(*)) /*maximum of the array is evaluated DISPLAY #RESULTA #RESULTADYN (AL=10) #RESULTI END
*MINVAL
/*MAXVAL
システム関数全体の結果のフォーマット/長さは 2 とおりの方法で定義できます。
*MINVAL
/*MAXVAL
システム関数全体の結果のフォーマット/長さは、IR
節で指定できます。 指定されたすべてのオペランドは、精度が損失ないのであれば、この結果のフォーマット/長さに変換されます。 その後、変換されたすべてのオペランドの最小/最大が評価され、評価されたフォーマット/長さを持つ単一スカラー値がシステム関数全体の結果として設定されます。
*MINVAL
/*MAXVAL
システム関数内で IR
節を使用しない場合、結果のフォーマット/長さは、*MINVAL
/*MAXVAL
システム関数内の引数として指定されたすべてのオペランドのフォーマット/長さに関連して評価されます。 各オペランドのフォーマット/長さが取得され、引数リストの次のオペランドのフォーマット/長さと結合されます。 そして、フォーマット/長さの変換規則表を使用して
2 つの単一オペランドの結果のフォーマット/長さが評価されます。
フォーマット/長さの変換規則表は、2 つの異なる表に分割されます。 下記の 2 つの表に示されていない組み合わせはすべて無効であり、*MINVAL
/*MAXVAL
システム関数の引数リスト内に適用しないでください。 キーワード "FLF" は、他の方法では精度の損失が生じる可能性があるため、結果のフォーマット/長さを定義するために IR
節を使用する必要があることを示します。
2 つの異なるオペランドの数値の組み合わせをすべて示しています。
第 2 オペランド | ||||||
---|---|---|---|---|---|---|
フォーマット/長さ | I1 | I2 | I4 | Pa.b、Na.b | F4、F8 | |
第 1 オペランド | I1 | I1 | I2 | I4 | Pmax(3,a)。b | F8 |
I2 | I2 | I2 | I4 | Pmax(5,a)。b | F8 | |
I4 | I4 | I4 | I4 | Pmax(10,a)。b | F8 | |
Px.y、Nx.y | Pmax(3,x)。y | Pmax(5,x)。y | Pmax(10,x)。y |
max(x,a) + max(y,b) <= 29 の場合 |
y=0 および x <=15 の場合 |
|
F4、F8 | F8 | F8 | F8 |
b=0 および a <=15 の場合 |
F8 |
凡例:
FLF | フォーマット/長さ宣言が強制されます。 結果のフォーマットは IR 節を使用して指定する必要があります。
|
---|---|
Ix | フォーマット/長さは整数です。 x では、整数の値を保存するために使用されるバイト数を指定します。 |
Fx | フォーマット/長さは浮動小数点です。 x では、浮動小数点の値を保存するために使用されるバイト数を指定します。 |
Px.y |
対応する小数点の前の桁数(x,a)および精度(y,b)を持つパックフォーマットです。 |
Nx.y |
対応する小数点の前の桁数(x,a)および精度(y,b)を持つ数値フォーマットです。 |
Pmax(c,d).e | 生成されるフォーマットはパックされています。 長さは後続の情報で評価されます。 小数点の前の桁数は、c および d の最大値です。 精度の値は、e です。 |
Pmax(c,d).max(e,f) | 生成されるフォーマットはパックされています。 長さは後続の情報で評価されます。 小数点の前の桁数は、c および d の最大値です。 精度の値は、e および f の最大値です。 |
*MINVAL
/*MAXVAL
システム関数オペランドに使用できるその他のフォーマットと長さをすべて示しています。
第 2 オペランド | ||||||
---|---|---|---|---|---|---|
フォーマット/長さ | D | T | Aa、A ダイナミック | Ba、B ダイナミック | Ua、U ダイナミック | |
第 1 オペランド | D | D | T | NA | NA | NA |
T | T | T | NA | NA | NA | |
Ax、A ダイナミック | NA | NA | A ダイナミック | B ダイナミック | U ダイナミック | |
Bx、B ダイナミック | NA | NA | B ダイナミック | B ダイナミック | U ダイナミック | |
Ux、U ダイナミック | NA | NA | U ダイナミック | U ダイナミック | U ダイナミック |
凡例:
NA | この組み合わせは許可されていません。 |
---|---|
D | 日付フォーマットです。 |
T | 時刻フォーマットです。 |
Bx、Ba | 長さ x, a のバイナリフォーマットです。 |
Ax、Aa | 長さ x, a の英数字フォーマットです。 |
Ux、Ua | 長さ x, a の Unicode フォーマットです。 |
B ダイナミック | ダイナミック長のバイナリフォーマットです。 |
A ダイナミック | ダイナミック長の英数字フォーマットです。 |
U ダイナミック | ダイナミック長の Unicode フォーマットです。 |
コンパイラは、上記の規則に基づいて、オペランドのペアを考慮し、各ペアの中間結果を計算することで、ソースオペランドを処理できます。 1 番目のペアは第 1 と第 2 オペランド、中間結果の 2 番目のペアと第 3 オペランド、などから構成されます。すべてのオペランドが処理された後、最後の結果は、最小/最大を評価するために全オペランドの比較に使用されるフォーマットと長さの比較を示します。 フォーマット/長さの評価にこの方法を使用するとき、オペランド format-lengths は任意の順序で示すことができます。
例:
DEFINE DATA LOCAL 1 A (I2) INIT <34> 1 B (P4.2) INIT <1234.56> 1 C (N4.4) INIT <12.6789> 1 D (I1) INIT <100> 1 E (I4/1:3) INIT <32, 6745, 456> 1 #RES-MIN (P10.7) 1 #RES-MAX (P10.7) END-DEFINE * MOVE *MINVAL(A, B, C, D, E(*)) TO #RES-MIN MOVE *MAXVAL(A, B, C, D, E(*)) TO #RES-MAX DISPLAY #RES-MIN #RES-MAX END
出力:
#RES-MIN #RES-MAX --------------------------- --------------------------- 12.6789000 6745.0000000
次の表は、例のフォーマット/長さを自動的に評価する単一ステップを示しています。 それは全ステップの中間結果(ir)および result-format/length として使用される比較フォーマット/長さ(cf)を示します。
評価順序 | 第 1 オペランド名 | 第 1 オペランドまたは中間結果のフォーマット/長さ | 第 2 オペランド名 | 第 2 オペランドまたは中間結果のフォーマット/長さ | 中間結果(ir)のフォーマット/長さ |
---|---|---|---|---|---|
1. | A | I2 | B | P4.2 | ir1 = P5.2 |
2. | ir1 | P5.2 | C | N4.4 | ir2 = P5.4 |
3. | ir2 | P5.4 | D | I1 | ir3 = P5.4 |
4. | ir3 | P5.4 | E | I4 | cf = P10.4 |
ランタイムに、すべてのオペランドは cf のフォーマット/長さに変換されます。 そして、変換されたすべての値が比較され、対応する最小/最大が評価されます。
下図は、フォーマットと長さが評価される順序を表しています。
凡例:
ir1、ir2、ir3 | 中間結果 1、2、3 です。 |
---|---|
cf | フォーマットと長さの比較です。 |