SAS 程序冷知识——关于有效数字

最近看到很多人在做有效数字的程序。SAS这样的软件居然没有提供有效数字的函数,实在是有点不合理。那么我也跟风写一个有效数字的程序。

1、data aaa;

2、ornum=12936;

3、efnum=0;

4、length ornumc $200.;

5、if int(ornum)^=ornum then ornumc=put(ornum,best.-l);

6、else ornumc=cats(put(ornum,best.),'.');

7、if efnum <=0 then do;put 'Error:!!!';stop;end;

8、dot=index(strip(ornumc),'.');

9、efb=prxmatch('/[1-9]/',strip(ornumc));

10、efe=efb+efnum;

11、if efb < dot <= efe then efe=efe+1;

12、if efe > dot > 1  then effectnumc=putn(ornum,cats('30.',efe-dot-1,'-l'));

13、else if  dot > 1 then effectnumc=put(round(ornum,10**(dot-1-efnum)),best.-l);

14、effectnum=input(effectnumc,best.);

15、run;

我们按行解释代码:

1、没啥说的。

2、ornum原始数字,要取近似值的那个数。

3、efnum是保留的位数。

4、为ornumc设定长度,他是原始数值的字符型。有效数字的基本思路是,先把数字变成字符型,然后找到要保留的那几个数字,然后确定这几个数字的位置,找到实际上相当于保留多少位小数。

5-6、生成变量ornumc,并在后面补上小数点。因为小数点位置是后面重要的计算依据。

7、这是防止输入数据不符合要求的语句。

8-10、变量dot是小数点的位置,efb是有效数字的起始位置,efe是有效数字的结束位置。因为估算要看保留位置后的一位,结束位置要比实际保留的位数多1,所以不需要减1。

11、要防止有效数字中间有小数点的情况,这种情况小数点占一位,所以要加上1,修正小数点的影响。

12、保留小数位要分两种情况考虑,一种是有小数部分,一种是没有小数部分。当第一种情况时,有效数字的结束位置比小数点位置大(小数点位置一定大于1),也就是符合条件 efe > dot > 1 ,此时,我们把format的长度定为一个比较大的长度——30,保留小数位应该是结束位置和小数点位置的差。减1是因为结束位置包括用来估算的最后一位。

13、第二种情况没有小数位,此时结束位置比小数点小(else if  dot > 1),此时需要计算round函数的第二个参数。先求出精确的位数(dot-1-efnum),然后把他作为10的指数,就可以得到round的参数了。

14、把数值型转成字符型。

15、结束。

你可能感兴趣的:(SAS 程序冷知识——关于有效数字)