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

*MINVAL

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

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

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


関数

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

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

制限

システム関数 *MINVAL/*MAXVAL を使用する場合、以下の制限が適用されます。

  • *MINVAL/*MAXVAL をターゲット変数が予期される位置に使用しないでください。

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

構文説明

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

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
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 を設定する必要があります。
AU または 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

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

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

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

*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 ダイナミック A ダイナミック U ダイナミック
Bx、B ダイナミック NA NA A ダイナミック 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 フォーマットです。

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 のフォーマット/長さに変換されます。続いて変換されたすべての値が比較され、対応する最小/最大値が評価されます。

注:

  1. オペランドが 1 つだけ指定された場合、result-format-length はこのオペランドのフォーマット/長さになります。

  2. 1 ~ 4 の長さのバイナリのオペランドが *MINVAL/*MAXVAL システム関数内の引数として英数字オペランドまたは Unicode オペランドとともに指定されている場合、中間結果(result-format-length)は、ダイナミック長の英数字フォーマットまたは Unicode フォーマットで評価されます。

    この場合、バイナリのオペランドの値は数値と見なされ、データ転送の規則に従って result-format-length に変換され(バイナリ数値はアンパックフォーマットに変換されます)、最小値/最大値が評価されます。

    例:

    DEFINE DATA LOCAL
    1 #B4 (B4)  INIT <1>
    1 #A10(A10) INIT <"2">
    END-DEFINE
    WRITE "=" *MAXVAL(#A10, #B4) (AL=60) /* RESULT FORMAT-LENGTH IS (A)DYNAMIC: "2"
    WRITE "=" *MINVAL(#A10, #B4) (AL=60) /* RESULT FORMAT-LENGTH IS (A)DYNAMIC: "1"
    END
    

    中間 result-format-length#A10#B4)は A ダイナミックです。

    そのため、まず #A10 が A ダイナミックに変換され、(データ転送の規則を考慮して)#B4 が A ダイナミックに変換された後、両方のオペランドの中間結果が評価されます。

フォーマット/長さの評価順序

下図は、フォーマットと長さが評価される順序を表しています。

凡例:

ir1、ir2、ir3 中間結果 1、2、3 です。
cf フォーマット/長さの比較結果。