Passing Real Numbers as Macro Variables
From sasCommunity
[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)
