int idx_1t::update(const dcomplex& d,intptr_t n1,intptr_t n2) { if(d.imag()!=0.0) return -1; return update((int64_t)d.real(),n1,n2); }
void complex_angle(dcomplex & val, dcomplex & err, double & angle, double & bias, double & angle_err) { doublevar ratio=val.imag()/val.real(); doublevar sigma_ratio=err.imag()*err.imag()/(val.real()*val.real()) +val.imag()*val.imag()*err.real()*err.real()/(pow(val.real(),4)); doublevar atander=1/(1+ratio*ratio); //first derivative of atan func doublevar atander2=-2*ratio*atander*atander; //second derivative bias=.5*atander2*sigma_ratio; angle_err=fabs(atander)*sqrt(sigma_ratio); angle=atan(fabs(ratio)); if(val.real() <0 && val.imag() >=0) angle=pi-angle; else if(val.real() >=0 && val.imag() <0) angle=2*pi-angle; else if(val.real() <0 && val.imag() <0) angle+=pi; }