/**********************************************************************/


data _null_;                         
   x=0;                              
   do i=1 to 10;                     
      x+0.1;                         
   end;                              
   if x=1 then put 'x is equal to 1';
   else put 'what happened?';        
run;                                 


/**********************************************************************/


x=0;                              
do i=1 to 10;                     
   x+0.1;                         
end;                              
if x=1 then put 'x is equal to 1';
else put 'x is not equal to 1';   


/**********************************************************************/


proc format;                              
   picture penny low-high='000,000,009.99'
           (mult=1 prefix='$');           
run;                                      


/**********************************************************************/


x=0;        
do i=1 to y;
   x+1/y;   
end;        


/**********************************************************************/


x=0;         
do i=1 to y; 
   x+1/y;    
end;         
x=ROUND(x,1);


/**********************************************************************/


data _null_;            
   fuzz=1*16**-11;      
   x=256.115;           
   y=round(x+fuzz, .01);
   put _all_;           
run;                    


/**********************************************************************/


x=0;        
do i=1 to y;
   x+1/y;   
end;        


/**********************************************************************/


if abs(x-y)<1e-12 then TRUE;
else FALSE;                 


/**********************************************************************/


%macro eqfuzz(var1, var2, fuzz=1e-12);
    abs(&var1-&var2)<&fuzz            
%mend;                                


/**********************************************************************/


data _null_;                             
    x=0;                                 
    do i=1 to 10;                        
       x+0.1;                            
    end;                                 
    y=1;                                 
    if x=y then                          
       put 'x exactly equal to y';       
    else if %eqfuzz(x,y) then            
               put 'x close enough to y';
    else put 'x not even close to y';    
run;                                     


/**********************************************************************/


%macro eqfuzz(var1,var2,fuzz=1e-12);
    abs((&var1-&var2) / &var1)<&fuzz
%mend;                              


/**********************************************************************/


data merged;                                   
   merge ds1   /* contains variables b and x */
         ds2;  /* contains variables b and y */
      by b;                                    
run;                                           


/**********************************************************************/


proc sql;                         
   create table joined as         
      select ds1.b,x,y            
         from ds1 full join ds2   
         on %eqfuzz(ds1.b, ds2.b);


/**********************************************************************/