Passing Real Numbers as Macro Variables

From sasCommunity

Jump to: navigation, search

[edit] Using SymputX to Convert Real Numbers to Macro Variables

DATA _Null_;
do Denominator = 1 to 19;
   Real = 1/Denominator;
   call symputx(catt('Real',Denominator)
               ,put(Real,hex16.)
               );
   call execute(catt('%nrstr(%Put Real'
                    ,Denominator,':&Real'
                    ,Denominator,
                    ';)'));
   end;
stop;
run;

log:

NOTE: CALL EXECUTE generated line.
1         +  %Put Real1:&Real1;
Real1:3FF0000000000000
2         +  %Put Real2:&Real2;
Real2:3FE0000000000000
3         +  %Put Real3:&Real3;
Real3:3FD5555555555555
4         +  %Put Real4:&Real4;
Real4:3FD0000000000000

... [snippage occureth]

15        +  %Put Real15:&Real15;
Real15:3FB1111111111111
16        +  %Put Real16:&Real16;
Real16:3FB0000000000000
17        +  %Put Real17:&Real17;
Real17:3FAE1E1E1E1E1E1E
18        +  %Put Real18:&Real18;
Real18:3FAC71C71C71C71C
19        +  %Put Real19:&Real19;
Real19:3FAAF286BCA1AF28


[edit] Reading Real Numbers in hex16 from Macro Variables

%Macro PutNumber(ConversionType=
                ,Hex16 =
                );
%put Hex16:&Hex16.=%sysevalf(&Hex16.x);
%local I Number Type1 Type2 Type3 Type4 Type5 Dim_Type;
%Let Type1 =;
%Let Type2 =boolean;
%Let Type3 =ceil   ;
%Let Type4 =floor  ;
%Let Type5 =integer;
%Let dim_Type=5;
%do I = 2 %to &Dim_Type.;
    %let Number = %sysevalf(&Hex16.x,&&Type&I.);
    %put Number:&Number. : &&Type&I.;
    %end;
Data   _Null_;
attrib Number length = 8;
Number = input("&Hex16.",hex16.);
put Number= hex16. ' :: ' Number 32.15;
stop;
run;
%Mend;
%Put %sysfunc(putn(1234.56,hex16.));
%PutNumber(Hex16 = 40934A3D70A3D70A);
%Put %sysfunc(putn(-1234.56,hex16.));
%PutNumber(Hex16 = C0934A3D70A3D70A);
%PutNumber(Hex16 = 0000000000000000);
%PutNumber(Hex16 = 1111111111111111);
%PutNumber(Hex16 = 3FF0000000000000);
%PutNumber(Hex16 = 4000000000000000);
%PutNumber(Hex16 = 4010000000000000);
%PutNumber(Hex16 = 4020000000000000);
%PutNumber(Hex16 = 4030000000000000);
%PutNumber(Hex16 = 4040000000000000);
%PutNumber(Hex16 = 4050000000000000);
%PutNumber(Hex16 = 4060000000000000);

see: http://www.sascommunity.org/wiki/Unintentional_Loss_of_Precision

--macro maven == the radical programmer 12:05, 25 August 2008 (EDT)

Personal tools