48template <
typename ScalarT>
49ScalarT
func(
const ScalarT&
a,
const ScalarT& b,
const ScalarT&
c) {
50 ScalarT r =
c*std::log(b+1.)/std::sin(
a);
56void func_deriv(
double a,
double b,
double c,
double& drda,
double& drdb)
58 drda = -(
c*std::log(b+1.)/std::pow(std::sin(
a),2.))*std::cos(
a);
59 drdb =
c / ((b+1.)*std::sin(
a));
62int main(
int argc,
char **argv)
64 double pi = std::atan(1.0)*4.0;
88 rfad =
func(afad, bfad, cfad);
91 double r_ad = rfad.val();
92 double drda_ad = rfad.dx(0);
93 double drdb_ad = rfad.dx(1);
98 std::cout.setf(std::ios::scientific);
99 std::cout.precision(
p);
100 std::cout <<
" r = " << r <<
" (original) == " << std::setw(w) << r_ad
101 <<
" (AD) Error = " << std::setw(w) << r - r_ad << std::endl
102 <<
"dr/da = " << std::setw(w) << drda <<
" (analytic) == "
103 << std::setw(w) << drda_ad <<
" (AD) Error = " << std::setw(w)
104 << drda - drda_ad << std::endl
105 <<
"dr/db = " << std::setw(w) << drdb <<
" (analytic) == "
106 << std::setw(w) << drdb_ad <<
" (AD) Error = " << std::setw(w)
107 << drdb - drdb_ad << std::endl;
109 double tol = 1.0e-14;
110 if (std::fabs(r - r_ad) <
tol &&
111 std::fabs(drda - drda_ad) <
tol &&
112 std::fabs(drdb - drdb_ad) <
tol) {
113 std::cout <<
"\nExample passed!" << std::endl;
117 std::cout <<
"\nSomething is wrong, example failed!" << std::endl;
expr expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c *expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 c
void func_deriv(double a, double b, double c, double &drda, double &drdb)
ScalarT func(const ScalarT &a, const ScalarT &b, const ScalarT &c)