1 #ifndef STAN_MATH_REV_SCAL_FUN_ATAN2_HPP
2 #define STAN_MATH_REV_SCAL_FUN_ATAN2_HPP
12 class atan2_vv_vari :
public op_vv_vari {
14 atan2_vv_vari(vari* avi, vari* bvi) :
15 op_vv_vari(std::
atan2(avi->val_, bvi->val_), avi, bvi) {
18 double a_sq_plus_b_sq = (avi_->val_ * avi_->val_)
19 + (bvi_->val_ * bvi_->val_);
20 avi_->adj_ += adj_ * bvi_->val_ / a_sq_plus_b_sq;
21 bvi_->adj_ -= adj_ * avi_->val_ / a_sq_plus_b_sq;
25 class atan2_vd_vari :
public op_vd_vari {
27 atan2_vd_vari(vari* avi,
double b) :
28 op_vd_vari(std::
atan2(avi->val_, b), avi, b) {
31 double a_sq_plus_b_sq = (avi_->val_ * avi_->val_) + (bd_ * bd_);
32 avi_->adj_ += adj_ * bd_ / a_sq_plus_b_sq;
36 class atan2_dv_vari :
public op_dv_vari {
38 atan2_dv_vari(
double a, vari* bvi) :
39 op_dv_vari(std::
atan2(a, bvi->val_), a, bvi) {
42 double a_sq_plus_b_sq = (ad_ * ad_) + (bvi_->val_ * bvi_->val_);
43 bvi_->adj_ -= adj_ * ad_ / a_sq_plus_b_sq;
63 return var(
new atan2_vv_vari(a.
vi_, b.
vi_));
79 return var(
new atan2_vd_vari(a.
vi_, b));
120 return var(
new atan2_dv_vari(a, b.
vi_));
fvar< T > atan2(const fvar< T > &x1, const fvar< T > &x2)
Independent (input) and dependent (output) variables for gradients.
vari * vi_
Pointer to the implementation of this variable.