2007年9月20日木曜日

%EVALでの計算における注意点



V8で%EVALでの計算結果の有効範囲は-2147483647~2147483647で


4バイト(符号の1ビット+31ビット)になります。


計算結果がこれを超えるとオーバーフローを起こします。


下記のようになります。



_/_/_/_/_/_/_/_/_/_/ program _/_/_/_/_/_/_/_/_/_/


%LET num1 = %EVAL(2147483646 + 1) ;


%PUT num1 : &num1 ;


%LET num2 = %EVAL(2147483646 + 2) ;


%PUT num2 : &num2 ;


%LET num3 = %EVAL(-2147483646 - 1) ;


%PUT num3 : &num3 ;


%LET num4 = %EVAL(-2147483646 - 2) ;


%PUT num4 : &num4 ;




_/_/_/_/_/_/_/_/_/_/_/ log _/_/_/_/_/_/_/_/_/_/


3274 %LET num1 = %EVAL(2147483646 + 1) ;


3275 %PUT num1 : &num1 ;


num1 : 2147483647


3276 %LET num2 = %EVAL(2147483646 + 2) ;


ERROR: オーバーフローが発生しました。計算を中止します。


3277 %PUT num2 : &num2 ;


num2 :


3278 %LET num3 = %EVAL(-2147483646 - 1) ;


3279 %PUT num3 : &num3 ;


num3 : -2147483647


3280 %LET num4 = %EVAL(-2147483646 - 2) ;


ERROR: オーバーフローが発生しました。計算を中止します。


3281 %PUT num4 : &num4 ;


num4 :



また、%IF~%THENでの値の比較に関しても、


片方の値が-2147483647~2147483647を超えるとオーバーフローします。


下記のようになります。



_/_/_/_/_/_/_/_/_/_/ program _/_/_/_/_/_/_/_/_/_/


%macro test1 ;


 %let test1 = 2147483647 ;


 %if &test1 = 100000 %then %do ;


  %put 条件一致 ;


 %end ;


 %else %do ;


  %put 条件不一致 ;


 %end ;


%mend ;


%test1;


 


%macro test2 ;


 %let test2 = 2147483648 ;


 %if &test2 = 100000 %then %do ;


  %put 条件一致 ;


 %end ;


 %else %do ;


  %put 条件不一致 ;


 %end ;


%mend ;


%test2;




_/_/_/_/_/_/_/_/_/_/_/ log _/_/_/_/_/_/_/_/_/_/


3282 %macro test1 ;


3283  %let test1 = 2147483647 ;


3284  %if &test1 = 100000 %then %do ;


3285   %put 条件一致 ;


3286  %end ;


3287  %else %do ;


3288   %put 条件不一致 ;


3289  %end ;


3290 %mend ;


3291 %test1;


条件不一致


 


3292 %macro test2 ;


3293  %let test2 = 2147483648 ;


3294  %if &test2 = 100000 %then %do ;


3295   %put 条件一致 ;


3296  %end ;


3297  %else %do ;


3298   %put 条件不一致 ;


3299  %end ;


3300 %mend ;


3301 %test2;


ERROR: オーバーフローが発生しました。計算を中止します。


ERROR: マクロ TEST2 の実行を中止します。



※ "="の部分は"^="、">"、">="、"<"、"<="でも同様です。


つまり、マクロプロセッサに計算させる場合、


有効な値は-2147483647~2147483647の4バイトになります。


ちなみに、%EVALでオーバーフローする場合は、%SYSFUNC(SUM())で対処できます。


また、%IF~%THENでオーバーフローする場合は、マクロ変数をダブルクォーテーションで括ることで、対処できます。




[google]

0 件のコメント:

コメントを投稿

ツイート数からみる"バーチャルYouTuber"ブーム

今や YouTuber の話題の半分を占めるほどのクチコミ数に 当社が提供するソーシャルビッグデータ検索ツールの「 beInsight (ビーインサイト)」を使って、話題の「バーチャル YouTuber 」について調べてみました。 「バーチャル YouTuber...