1 #ifndef __STAN__AGRAD__REV__ATAN2_HPP__
2 #define __STAN__AGRAD__REV__ATAN2_HPP__
14 class atan2_vv_vari :
public op_vv_vari {
16 atan2_vv_vari(vari* avi, vari* bvi) :
17 op_vv_vari(std::
atan2(avi->val_,bvi->val_),avi,bvi) {
20 double a_sq_plus_b_sq = (
avi_->val_ *
avi_->val_) + (
bvi_->val_ *
bvi_->val_);
21 avi_->adj_ += adj_ *
bvi_->val_ / a_sq_plus_b_sq;
22 bvi_->adj_ -= adj_ *
avi_->val_ / a_sq_plus_b_sq;
26 class atan2_vd_vari :
public op_vd_vari {
28 atan2_vd_vari(vari* avi,
double b) :
29 op_vd_vari(std::
atan2(avi->val_,b),avi,b) {
33 avi_->adj_ += adj_ * bd_ / a_sq_plus_b_sq;
37 class atan2_dv_vari :
public op_dv_vari {
39 atan2_dv_vari(
double a, vari* bvi) :
40 op_dv_vari(std::
atan2(a,bvi->val_),a,bvi) {
44 bvi_->adj_ -= adj_ *
ad_ / a_sq_plus_b_sq;
63 inline var
atan2(
const var& a,
const var& b) {
64 return var(
new atan2_vv_vari(a.vi_,b.vi_));
80 return var(
new atan2_vd_vari(a.
vi_,b));
96 return var(
new atan2_dv_vari(a,b.
vi_));