CLHEP VERSION Reference Documentation
   
CLHEP Home Page     CLHEP Documentation     CLHEP Bug Reports

testBug90848.cc

Go to the documentation of this file.
00001 // test Bug #90848 in CLHEP::Evaluator
00002 // Author: Tom Roberts
00003 
00004 #include <stdlib.h>
00005 #include <stdio.h>
00006 #include <cmath>
00007 #include <limits>
00008 
00009 #include "CLHEP/Evaluator/Evaluator.h"
00010 class MyEvaluator : public HepTool::Evaluator {
00011 public:
00012         MyEvaluator() : HepTool::Evaluator() { setStdMath(); }
00013         bool isOK() { return status() == OK; }
00014         double evaluate(const char *e) {
00015                 double v = HepTool::Evaluator::evaluate(e);
00016                 if(status() != OK) v = std::numeric_limits<double>::quiet_NaN();
00017                 return v;
00018         }
00019 };
00020 
00021 struct Test { 
00022         const char *expr;
00023         double value1;          // x=1, y=2, z=3
00024         double value2;          // x=10, y=-20 z=-30
00025 };
00026 
00027 Test tests[] = {
00028         { "x",                                  1.0,            10.0},
00029         { "y",                                  2.0,            -20.0},
00030         { "z",                                  3.0,            -30.0},
00031         { "x+y",                                3.0,            -10.0},
00032         { "-z",                                 -3.0,           30.0},
00033         { "0-z",                                -3.0,           30.0},
00034         { "0 - -z",                             3.0,            -30.0},
00035         { "10/-x",                              -10.0,          -1.0},
00036         { "exp(-y)*exp(y)",                     1.0,            1.0},
00037         { "exp(-y^2)*exp(y^2)",                 1.0,            1.0},
00038         { "-5*x",                               -5.0,           -50.0},
00039         { "5+-x",                               4.0,            -5.0},
00040         { "5+(-x)",                             4.0,            -5.0},
00041         { "5*-x",                               -5.0,           -50.0},
00042         { "5*(-x)",                             -5.0,           -50.0},
00043         { "-z^2",                               -9.0,           -900.0},
00044         { "0-z^2",                              -9.0,           -900.0},
00045         { "exp(-0.2*z^2)*exp(0.2*z^2)",         1.0,            1.0},
00046         { "exp(0.2*-z^2)*exp(0.2*z^2)",         1.0,            1.0},
00047         { "exp(-z^2*0.2)*exp(0.2*z^2)",         1.0,            1.0},
00048         { "exp(0.2*-(z^2))*exp(0.2*z^2)",       1.0,            1.0},
00049         { "exp(-(z^2)*0.2)*exp(0.2*z^2)",       1.0,            1.0},
00050         { "exp(-0.2*z)*exp(0.2*z)",             1.0,            1.0},
00051         { "exp(0.2*-z)*exp(0.2*z)",             1.0,            1.0},
00052         { "exp(-z*0.2)*exp(0.2*z)",             1.0,            1.0},
00053 };
00054 
00055 int main() {
00056         MyEvaluator e;
00057 
00058         e.setVariable("x",1.0);
00059         e.setVariable("y",2.0);
00060         e.setVariable("z",3.0);
00061 //printf("x=1.0 y=2.0 z=3.0\n");
00062         int err=0;
00063         for(unsigned i=0; i<sizeof(tests)/sizeof(Test); ++i) {
00064                 double v=e.evaluate(tests[i].expr);
00065                 if(std::isnan(v) || std::fabs(v-tests[i].value1) > 1E-12 || !e.isOK()) {
00066                         printf("%s = %.6f should be %.6f\n",tests[i].expr,
00067                                 e.evaluate(tests[i].expr),tests[i].value1);
00068                         err = 1;
00069                 }
00070         }
00071 
00072         e.setVariable("x",10.0);
00073         e.setVariable("y",-20.0);
00074         e.setVariable("z",-30.0);
00075 //printf("x=10.0 y=-20.0 z=-30.0\n");
00076         for(unsigned i=0; i<sizeof(tests)/sizeof(Test); ++i) {
00077                 double v=e.evaluate(tests[i].expr);
00078                 if(std::isnan(v) || std::fabs(v-tests[i].value2) > 1E-12 || !e.isOK()) {
00079                         printf("%s = %.6f should be %.6f\n",tests[i].expr,
00080                                 e.evaluate(tests[i].expr),tests[i].value2);
00081                         err = 1;
00082                 }
00083         }
00084 
00085         double v=e.evaluate("unknown(0.0)");
00086         if(!std::isnan(v) || e.isOK()) {
00087                 printf("%s succeeded\n","unknown(0.0)");
00088                 err=1;
00089         }
00090 
00091         v = e.evaluate("unknown+0.0");
00092         if(!std::isnan(v) || e.isOK()) {
00093                 printf("%s succeeded\n","unknown+0.0");
00094                 err=1;
00095         }
00096 
00097         exit(err);
00098 }

Generated on 15 Nov 2012 for CLHEP by  doxygen 1.4.7