44       result_type(
const double __f,
 
   60       operator double()
 const 
   97     inline result_type operator()(
const double x,
 
  101       return result_type(f (x) * f (y) * f (z),
 
  102                          fp(x) * f (y) * f (z),
 
  103                          f (x) * fp(y) * f (z),
 
  104                          f (x) * f (y) * fp(z));
 
  119     inline double operator()(
const double xmin, 
const double xmax,
 
  120                              const double ymin, 
const double ymax,
 
  121                              const double zmin, 
const double zmax)
 const 
  123       return ((__f1.getIntegral(xmax) - __f1.getIntegral(xmin)) *
 
  124               (__f1.getIntegral(ymax) - __f1.getIntegral(ymin)) *
 
  125               (__f1.getIntegral(zmax) - __f1.getIntegral(zmin)));
 
  136     inline double f(
const double x)
 const 
  138       return __f1.getValue(x);
 
  148     inline double fp(
const double x)
 const 
  150       return __f1.getDerivative(x);
 
  160   template<
class JMultiFunction_t>
 
  161   int do_main(
int argc, 
char **argv, 
const char* title)
 
  170     precision[
"spline"] = 1.0e-3;
 
  171     precision[
"polint"] = 1.0e-10;
 
  175       JParser<> zap(
"Example program to test multi-dimensional integration.");
 
  184     catch(
const exception &error) {
 
  185       FATAL(error.what() << endl);
 
  189     if (numberOfBins <= 2) {
 
  190       FATAL(
"Number of bins " << numberOfBins << endl);
 
  196     const JFunction3D 
f3(f1);
 
  198     const double xmin = -1.0;
 
  199     const double xmax = +1.0;
 
  200     const double dx   = (xmax - xmin) / (numberOfBins - 1);
 
  205     for (
double x = xmin; x < xmax + 0.5*dx; x += dx) {
 
  206       for (
double y = xmin; y < xmax + 0.5*dx; y += dx) {
 
  207         for (
double z = xmin; z < xmax + 0.5*dx; z += dx) {
 
  208           g3[x][y][z] = 
f3(x,y,z);
 
  218            << setw(8)  << left  << title        << 
' '  
  219            << setw(12) << right << 
"real"       << 
' '  
  220            << setw(12) << right << 
"calculated" << endl;
 
  221       cout << setw(8)  << left  << 
"integral";
 
  222       cout << 
' ' << 
SCIENTIFIC(12,4) << 
f3(xmin, xmax, xmin, xmax, xmin, xmax);
 
  227     ASSERT(fabs(
f3(xmin, xmax, xmin, xmax, xmin, xmax) - 
getIntegral(g3)) <= precision[title] * 
f3(xmin, xmax, xmin, xmax, xmin, xmax));
 
  240 int main(
int argc, 
char **argv)
 
  251     if (do_main<JMultiFunction_t>(argc, argv, 
"polint") != 0) 
return 1;
 
  260     if (do_main<JMultiFunction_t>(argc, argv, 
"spline") != 0) 
return 1;