In reply to Jim Barbour.

Jim, you're correct - the ACT/ACT and AGE algorithms are different. Here's a SAS program that emulates the ACT/ACT algorithm and compares to YRDIF for ACT/ACT and AGE.

data _null_;
input start: date9. end: date9.;
inc365=0; inc366=0;
startyr=year(start); endyr=year(end);
yeardays=mdy(12,31,startyr)-mdy(1,1,startyr)+1;
ndays=mdy(1,1,startyr+1)-start;
if yeardays=365 then inc365+ndays;
else inc366+ndays;
do i=startyr+1 to endyr-1;
yeardays=mdy(12,31,i)-mdy(1,1,i)+1;
if yeardays=365 then inc365+365;
else inc366+366;
end;
yeardays=mdy(12,31,endyr)-mdy(1,1,endyr)+1;
ndays=end-mdy(1,1,endyr); /* last day not included */
if yeardays=365 then inc365+ndays;
else inc366+ndays;
total=inc365/365+inc366/366;
by_yrdif=yrdif(start,end,'ACT/ACT');
by_yrdif_age=yrdif(start,end,'AGE');
matched_DIF=(total=by_yrdif);
matched_AGE=(int(total)=by_yrdif_age);
put start=date9. end=date9. matched_DIF= total= by_yrdif= by_yrdif_age matched_AGE= ;
cards;
29FEB1960 28FEB2000
29FEB1960 28FEB2001
29FEB1960 28FEB2002
29FEB1960 28FEB2003
29FEB1960 28FEB2004
29FEB1960 28FEB2005
29FEB1960 28FEB2006
29FEB1960 28FEB2007
29FEB1960 28FEB2008
29FEB1960 28FEB2009
29FEB1960 28FEB2010
29FEB1960 28FEB2011
29FEB1960 28FEB2012
29FEB1960 28FEB2013
29FEB1960 28FEB2014
29FEB1960 28FEB2015
29FEB1960 28FEB2016
29FEB1964 28FEB2000
29FEB1964 28FEB2001
29FEB1964 28FEB2002
29FEB1964 28FEB2003
29FEB1964 28FEB2004
29FEB1964 28FEB2005
29FEB1964 28FEB2006
29FEB1964 28FEB2007
29FEB1964 28FEB2008
29FEB1964 28FEB2009
29FEB1964 28FEB2010
29FEB1964 28FEB2011
29FEB1964 28FEB2012
29FEB1964 28FEB2013
29FEB1964 28FEB2014
29FEB1964 28FEB2015
29FEB1964 28FEB2016
29FEB1968 28FEB2000
29FEB1968 28FEB2001
29FEB1968 28FEB2002
29FEB1968 28FEB2003
29FEB1968 28FEB2004
29FEB1968 28FEB2005
29FEB1968 28FEB2006
29FEB1968 28FEB2007
29FEB1968 28FEB2008
29FEB1968 28FEB2009
29FEB1968 28FEB2010
29FEB1968 28FEB2011
29FEB1968 28FEB2012
29FEB1968 28FEB2013
29FEB1968 28FEB2014
29FEB1968 28FEB2015
29FEB1968 28FEB2016
run;