1 #ifndef STAN__AGRAD__REV__FUNCTIONS__FMOD_HPP
2 #define STAN__AGRAD__REV__FUNCTIONS__FMOD_HPP
9 #include <boost/math/special_functions/fpclassify.hpp>
15 class fmod_vv_vari :
public op_vv_vari {
17 fmod_vv_vari(vari* avi, vari* bvi) :
18 op_vv_vari(std::
fmod(avi->val_,bvi->val_),avi,bvi) {
23 avi_->adj_ = std::numeric_limits<double>::quiet_NaN();
24 bvi_->adj_ = std::numeric_limits<double>::quiet_NaN();
27 bvi_->adj_ -= adj_ *
static_cast<int>(avi_->val_ / bvi_->val_);
32 class fmod_vd_vari :
public op_vd_vari {
34 fmod_vd_vari(vari* avi,
double b) :
35 op_vd_vari(std::
fmod(avi->val_,b),avi,b) {
40 avi_->adj_ = std::numeric_limits<double>::quiet_NaN();
46 class fmod_dv_vari :
public op_dv_vari {
48 fmod_dv_vari(
double a, vari* bvi) :
49 op_dv_vari(std::
fmod(a,bvi->val_),a,bvi) {
54 bvi_->adj_ = std::numeric_limits<double>::quiet_NaN();
56 int d =
static_cast<int>(ad_ / bvi_->val_);
57 bvi_->adj_ -= adj_ * d;
106 return var(
new fmod_vv_vari(a.
vi_,b.
vi_));
123 return var(
new fmod_vd_vari(a.
vi_,b));
140 return var(
new fmod_dv_vari(a,b.
vi_));
bool isnan(const stan::agrad::var &v)
Checks if the given number is NaN.
vari * vi_
Pointer to the implementation of this variable.
Independent (input) and dependent (output) variables for gradients.
fvar< T > fmod(const fvar< T > &x1, const fvar< T > &x2)