[ADMB Users] atan2 for dvariables gives wrong result
Mirko Scholz
mscholz5 at gwdg.de
Sun Mar 6 04:38:20 PST 2011
Hello,
the following code gives different results for atan2 depending
if it operates on dvariables or doubles. The following versions
of ADMB have this issue
admb-10.0-linux-gcc4.4.5-64bit
admb-10.0-linux-gcc4.4.5-64bit
#include <fvar.hpp>
int main(void)
{
independent_variables s(1,2);
s[1] = -0.977396;
s[2] = -0.211418;
gradient_structure gs;
dvar_vector ss(1,2);
ss[1] = s[1];
ss[2] = s[2];
// wrong value
cout<<"atan2(dvariable,dvariable)="<<atan2(ss[1],ss[2])<<endl;
dvector st(1,2);
st[1] = value(ss[1]);
st[2] = value(ss[2]);
// correct value
cout<<"atan2(double,double)="<<atan2(st[1], st[2])<<endl;
//atan2(dvariable,dvariable)=1.35777
//atan2(double,double)=-1.78382
return 0;
}
I feel not able to fix it directly since my understanding of ADMB
is rather limited currently, but the following workaround fixed
the issue for me
ph = atan(ss[1]/ss[2]);
if (ss[1]>0 && ss[2]>0) ph = ph;
else if (ss[1]>0 && ss[2]<0) ph = M_PI+ph;
else if (ss[1]<0 && ss[2]<0) ph = ph-M_PI;
else if (ss[1]<0 && ss[2]>0) ph = ph;
// ph = atan2(ss[1], ss[2])
Regards
Mirko Scholz
More information about the Users
mailing list