CLHEP VERSION Reference Documentation
CLHEP Home Page CLHEP Documentation CLHEP Bug Reports |
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 }