1 #ifndef STAN__AGRAD__REV__FUNCTIONS__ATAN2_HPP
2 #define STAN__AGRAD__REV__FUNCTIONS__ATAN2_HPP
15 class atan2_vv_vari :
public op_vv_vari {
17 atan2_vv_vari(vari* avi, vari* bvi) :
18 op_vv_vari(::
atan2(avi->val_,bvi->val_),avi,bvi) {
21 double a_sq_plus_b_sq = (avi_->val_ * avi_->val_) + (bvi_->val_ * bvi_->val_);
22 avi_->adj_ += adj_ * bvi_->val_ / a_sq_plus_b_sq;
23 bvi_->adj_ -= adj_ * avi_->val_ / a_sq_plus_b_sq;
27 class atan2_vd_vari :
public op_vd_vari {
29 atan2_vd_vari(vari* avi,
double b) :
30 op_vd_vari(::
atan2(avi->val_,b),avi,b) {
33 double a_sq_plus_b_sq = (avi_->val_ * avi_->val_) + (bd_ * bd_);
34 avi_->adj_ += adj_ * bd_ / a_sq_plus_b_sq;
38 class atan2_dv_vari :
public op_dv_vari {
40 atan2_dv_vari(
double a, vari* bvi) :
41 op_dv_vari(::
atan2(a,bvi->val_),a,bvi) {
44 double a_sq_plus_b_sq = (ad_ * ad_) + (bvi_->val_ * bvi_->val_);
45 bvi_->adj_ -= adj_ * ad_ / a_sq_plus_b_sq;
65 return var(
new atan2_vv_vari(a.
vi_,b.
vi_));
81 return var(
new atan2_vd_vari(a.
vi_,b));
122 return var(
new atan2_dv_vari(a,b.
vi_));
vari * vi_
Pointer to the implementation of this variable.
fvar< T > atan2(const fvar< T > &x1, const fvar< T > &x2)
Independent (input) and dependent (output) variables for gradients.