前のページ|次のページ

マクロプロセッサによる演算式の評価方法

数値オペランドの評価

マクロ機能は、文字列を処理する機能です。ただし、特定の状況において、マクロプロセッサは数値を表すオペランドを数値として評価できます。マクロプロセッサは、算術演算子および数値を表すオペランドを含む式を評価します。そのとき、一時的にそのオペランドを数値に変換してから整数算術演算を実行します。評価結果はテキストになります。
デフォルトでは、ほとんどのマクロステートメントおよびマクロ関数における算術演算は、整数演算を使用して評価されます。ただし、%SYSEVALF関数を除きます。詳細については、 浮動小数点オペランドの評価を参照してください。次のマクロステートメントで、整数演算の評価を説明します。
%let a=%eval(1+2);
%let b=%eval(10*3);
%let c=%eval(4/2);
%let i=%eval(5/3);
%put The value of a is &a;
%put The value of b is &b;
%put The value of c is &c;
%put The value of I is &i;
これらのステートメントをサブミットすると、次のメッセージがログに表示されます。
The value of a is 3
The value of b is 30
The value of c is 2
The value of I is 1
最後のステートメントの結果に注目してください。整数に対して、通常は小数を含む結果が得られるはずの除算を実行すると、整数演算によって小数部が切り捨てられます。
マクロプロセッサは、文字オペランドを含む整数演算式を評価すると、エラーを生成します。整数値または16進値を表す文字を含むオペランドのみが、数値に変換されます。次のステートメントは、誤った使用方法を示しています。
%let d=%eval(10.0+20.0);   /*INCORRECT*/
%EVAL関数が整数演算のみをサポートしています。マクロプロセッサはピリオドを含む値を数値に変換しないので、このオペランドは文字オペランドとして評価されます。このステートメントによって次のエラーメッセージが生成されます。
ERROR: A character operand was found in the %EVAL function or %IF
condition where a numeric operand is required. The condition was:
10.0+20.0

浮動小数点オペランドの評価

%SYSEVALF関数は、浮動小数点値を表すオペランドを含む演算式を評価します。たとえば、%SYSEVALF関数に与えられた次の式は、浮動小数点演算を使用して評価されます。
%let a=%sysevalf(10.0*3.0);
%let b=%sysevalf(10.5+20.8);
%let c=%sysevalf(5/3);
%put 10.0*3.0 = &a;
%put 10.5+20.8 = &b;
%put 5/3 = &c;
%PUTステートメントによって、次のメッセージがログに表示されます。
10.0*3.0 = 30
10.5+20.8 = 31.3
5/3 = 1.6666666667
%SYSEVALF関数は、演算式を評価するときに、数値を表すオペランドを一時的に浮動小数点値に変換します。評価結果は、浮動少数点値で表される場合がありますが、整数演算式と同様に常にテキストです。
%SYSEVALF関数には、BOOLEAN、INTEGER、CEIL、およびFLOORという変換タイプ仕様が用意されています。たとえば、次の%PUTステートメントは、それぞれ1、2、3、および2を返します。
%let a=2.5;
%put %sysevalf(&a,boolean);
%put %sysevalf(&a,integer);
%put %sysevalf(&a,ceil);
%put %sysevalf(&a,floor);
これらの変換タイプは、整数値やブール値を必要とする他のマクロ式で使用できるように、%SYSEVALFが返す値を調整します。
注意:
%SYSEVALF関数に対して、変換タイプを指定してください。
%SYSEVALF関数をマクロ式で使用した場合、または%SYSEVALF関数の結果を他のマクロ式で使用されるマクロ変数に割り当てた場合、%SYSEVALF関数が欠損値または浮動小数点値を返すと、エラーまたは予期しない結果が生じる恐れがあります。エラーを防ぐには、他のマクロ式と互換性のある値を返す変換タイプを指定します。DISKファイルの使用については、%SYSEVALF関数 を参照してください。
前のページ|次のページ|ページの先頭へ