バージョン 6.3.3
 —  システム関数  —

*MINVAL/*MAXVAL - 最小値/最大値の評価

*MINVAL

([(IR=result-format/length)] operand,...)
*MAXVAL

フォーマット/長さ:フォーマットおよび長さは、IR 節を使用して明示的に指定するか、後述のフォーマット/長さの変換規則表を使用して自動的に評価できます。

このドキュメントでは、次のトピックについて説明します。


関数

*MINVAL/*MAXVAL システム関数は、指定されたすべてのオペランド値の最小値/最大値を評価します。 結果は常にスカラー値です。 オペランドとして配列が指定された場合、すべての配列フィールドの最小/最大が評価されます。

*MINVAL/*MAXVAL システム関数は、*MINVAL/*MAXVAL が許可されるステートメントの任意の位置にオペランドとして指定できます。 ただし、ターゲット変数が予期される位置に *MINVAL/*MAXVAL を使用しないでください。

*MINVAL/*MAXVAL は、システム関数でネストすることはできません。

英字データまたはバイナリデータを引数として使用するとき、データが同一であれば(例えば、*MINVAL('AB','AB'))、結果は最小/最大の長さを持つ引数になります。

Top of page

構文説明

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand C S A G   A U N P I F B D T         不可

構文要素の説明:

*MINVAL 指定されたすべてのオペランド値の最小値を評価します。
*MAXVAL 指定されたすべてのオペランド値の最大値を評価します。
operand *MINVAL/*MAXVAL システム関数で最小値/最大値が評価されるオペランドです。
result-format-length 結果のフォーマット/長さを明示的に指定するための中間結果節です。 下記の「IR 節」を参照してください。

IR 節

IR(中間結果)節は、*MINVAL/*MAXVAL システム関数全体の result-format/length を明示的に指定するために使用できます。

IR=result-format/length
IR=

format-length

(

A
U
B

) DYNAMIC

結果のフォーマット/長さの有効な組み合わせについては、後述のフォーマット/長さの変換規則表を参照してください。

構文要素の説明:

format-length コンパイラは関数全体の結果のフォーマット/長さを決定しようとします。 コンパイラが、精度に損失のないことが保証される方法でフォーマット/長さを決定できない場合、プログラマが IR オペランド拡張を使用して format-length を設定する必要があります。
A、U、または B フォーマット:ダイナミック変数用の英数字、Unicode、またはバイナリです。
DYNAMIC 固定フォーマット/長さを指定する代わりに、ダイナミック長の英数字フォーマット、Unicode フォーマット、またはバイナリフォーマットを指定できます。

例:

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

Top of page

結果のフォーマット/長さの変換規則表

*MINVAL/*MAXVAL システム関数全体の結果のフォーマット/長さは 2 とおりの方法で定義できます。

結果のフォーマット/長さの明示的な指定

*MINVAL/*MAXVAL システム関数全体の結果のフォーマット/長さは、IR 節で指定できます。 指定されたすべてのオペランドは、精度が損失ないのであれば、この結果のフォーマット/長さに変換されます。 その後、変換されたすべてのオペランドの最小/最大が評価され、評価されたフォーマット/長さを持つ単一スカラー値がシステム関数全体の結果として設定されます。

結果のフォーマット/長さの暗黙的な指定

*MINVAL/*MAXVAL システム関数内で IR 節を使用しない場合、結果のフォーマット/長さは、*MINVAL/*MAXVAL システム関数内の引数として指定されたすべてのオペランドのフォーマット/長さに関連して評価されます。 各オペランドのフォーマット/長さが取得され、引数リストの次のオペランドのフォーマット/長さと結合されます。 そして、フォーマット/長さの変換規則表を使用して 2 つの単一オペランドの結果のフォーマット/長さが評価されます。

フォーマット/長さの変換規則表は、2 つの異なる表に分割されます。 下記の 2 つの表に示されていない組み合わせはすべて無効であり、*MINVAL/*MAXVAL システム関数の引数リスト内に適用しないでください。 キーワード "FLF" は、他の方法では精度の損失が生じる可能性があるため、結果のフォーマット/長さを定義するために IR 節を使用する必要があることを示します。

表 1

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 の場合
Pmax(x,a).max(y,b)
else FLF

y=0 および x <=15 の場合
F8
else FLF

F4、F8 F8 F8 F8

b=0 および a <=15 の場合
F8
else FLF

F8

凡例:

FLF フォーマット/長さ宣言が強制されます。 結果のフォーマットは IR 節を使用して指定する必要があります。
Ix フォーマット/長さは整数です。 x では、整数の値を保存するために使用されるバイト数を指定します。
Fx フォーマット/長さは浮動小数点です。 x では、浮動小数点の値を保存するために使用されるバイト数を指定します。

Px.y
Pa,b

対応する小数点の前の桁数(x,a)および精度(y,b)を持つパックフォーマットです。

Nx.y
Na,b

対応する小数点の前の桁数(x,a)および精度(y,b)を持つ数値フォーマットです。
Pmax(c,d).e 生成されるフォーマットはパックされています。 長さは後続の情報で評価されます。 小数点の前の桁数は、c および d の最大値です。 精度の値は、e です。
Pmax(c,d).max(e,f) 生成されるフォーマットはパックされています。 長さは後続の情報で評価されます。 小数点の前の桁数は、c および d の最大値です。 精度の値は、e および f の最大値です。

表 2

*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 フォーマットです。

Top of page

result-format-length の評価

コンパイラは、上記の規則に基づいて、オペランドのペアを考慮し、各ペアの中間結果を計算することで、ソースオペランドを処理できます。 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 フォーマットと長さの比較です。

Top of page