C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html
This commit is contained in:
parent
456f5ba457
commit
87d4220f7a
18
exprtk.hpp
18
exprtk.hpp
|
@ -225,8 +225,9 @@ namespace exprtk
|
|||
|
||||
static const std::string reserved_words[] =
|
||||
{
|
||||
"and", "false", "for", "if", "ilike", "in", "like", "nand", "nor", "not",
|
||||
"null", "or", "shl", "shr", "true", "while", "xnor", "xor", "&", "|"
|
||||
"and", "false", "for", "if", "ilike", "in", "like", "nand", "nor",
|
||||
"not", "null", "or", "shl", "shr", "true", "while", "xnor", "xor",
|
||||
"&", "|"
|
||||
};
|
||||
|
||||
static const std::size_t reserved_words_size = sizeof(reserved_words) / sizeof(std::string);
|
||||
|
@ -234,12 +235,13 @@ namespace exprtk
|
|||
static const std::string reserved_symbols[] =
|
||||
{
|
||||
"abs", "acos", "and", "asin", "atan", "atan2", "avg", "ceil", "clamp",
|
||||
"cos", "cosh", "cot", "csc", "deg2grad", "deg2rad", "equal", "erf", "erfc",
|
||||
"exp", "false", "floor", "for", "frac", "grad2deg", "hypot", "if", "ilike",
|
||||
"in", "inrange", "like", "log", "log10", "logn", "log1p", "max", "min", "mod",
|
||||
"mul", "nand", "nor", "not", "not_equal", "null", "or", "pow", "rad2deg",
|
||||
"root", "round", "roundn", "sec", "sgn", "shl", "shr", "sin", "sinh", "sqrt",
|
||||
"sum", "tan", "tanh", "true", "trunc", "while", "xnor", "xor", "&", "|"
|
||||
"cos", "cosh", "cot", "csc", "deg2grad", "deg2rad", "equal", "erf",
|
||||
"erfc", "exp", "false", "floor", "for", "frac", "grad2deg", "hypot",
|
||||
"if", "ilike", "in", "inrange", "like", "log", "log10", "logn", "log1p",
|
||||
"max", "min", "mod", "mul", "nand", "nor", "not", "not_equal", "null",
|
||||
"or", "pow", "rad2deg", "root", "round", "roundn", "sec", "sgn", "shl",
|
||||
"shr", "sin", "sinh", "sqrt", "sum", "tan", "tanh", "true", "trunc",
|
||||
"while", "xnor", "xor", "&", "|"
|
||||
};
|
||||
|
||||
static const std::size_t reserved_symbols_size = sizeof(reserved_symbols) / sizeof(std::string);
|
||||
|
|
|
@ -32,6 +32,7 @@ const std::string expression_list[] = {
|
|||
"(y + x / y) * (x - y / x)",
|
||||
"x / ((x + y) + (x - y)) / y",
|
||||
"1 - ((x * y) + (y / x)) - 3",
|
||||
"(5.5 + x) + (2 * x - 2 / 3 * y) * (x / 3 + y / 4) + (y + 7.7)",
|
||||
"1.1x^1 + 2.2y^2 - 3.3x^3 + 4.4y^15 - 5.5x^23 + 6.6y^55",
|
||||
"sin(2 * x) + cos(pi / y)",
|
||||
"1 - sin(2 * x) + cos(pi / y)",
|
||||
|
@ -217,47 +218,52 @@ struct native
|
|||
|
||||
static inline T func07(Type x, Type y)
|
||||
{
|
||||
return (1.1*pow(x,T(1.0))+2.2*pow(y,T(2.0))-3.3*pow(x,T(3.0))+4.4*pow(y,T(15.0))-5.5*pow(x,T(23.0))+6.6*pow(y,T(55.0)));
|
||||
return (T(5.5) + x) + (T(2) * x - T(2) / T(3) * y) * (x / T(3) + y / T(4)) + (y + T(7.7));
|
||||
}
|
||||
|
||||
static inline T func08(Type x, Type y)
|
||||
{
|
||||
return std::sin(T(2.0) * x) + std::cos(pi / y);
|
||||
return (1.1*pow(x,T(1.0))+2.2*pow(y,T(2.0))-3.3*pow(x,T(3.0))+4.4*pow(y,T(15.0))-5.5*pow(x,T(23.0))+6.6*pow(y,T(55.0)));
|
||||
}
|
||||
|
||||
static inline T func09(Type x, Type y)
|
||||
{
|
||||
return T(1.0) - std::sin(2.0 * x) + std::cos(pi / y);
|
||||
return std::sin(T(2.0) * x) + std::cos(pi / y);
|
||||
}
|
||||
|
||||
static inline T func10(Type x, Type y)
|
||||
{
|
||||
return std::sqrt(T(111.111) - std::sin(T(2.0) * x) + std::cos(pi / y) / T(333.333));
|
||||
return T(1.0) - std::sin(2.0 * x) + std::cos(pi / y);
|
||||
}
|
||||
|
||||
static inline T func11(Type x, Type y)
|
||||
{
|
||||
return ((x * x) / std::sin(T(2.0) * pi / y)) -x / T(2.0);
|
||||
return std::sqrt(T(111.111) - std::sin(T(2.0) * x) + std::cos(pi / y) / T(333.333));
|
||||
}
|
||||
|
||||
static inline T func12(Type x, Type y)
|
||||
{
|
||||
return (x + (std::cos(y - std::sin(2 / x * pi)) - std::sin(x - std::cos(2 * y / pi))) - y);
|
||||
return ((x * x) / std::sin(T(2.0) * pi / y)) -x / T(2.0);
|
||||
}
|
||||
|
||||
static inline T func13(Type x, Type y)
|
||||
{
|
||||
return clamp(T(-1.0), std::sin(T(2.0) * pi * x) + std::cos(y / T(2.0) * pi), + T(1.0));
|
||||
return (x + (std::cos(y - std::sin(2 / x * pi)) - std::sin(x - std::cos(2 * y / pi))) - y);
|
||||
}
|
||||
|
||||
static inline T func14(Type x, Type y)
|
||||
{
|
||||
return std::max(T(3.33), std::min(sqrt(T(1.0) - std::sin(T(2.0) * x) + std::cos(pi / y) / T(3.0)), T(1.11)));
|
||||
return clamp(T(-1.0), std::sin(T(2.0) * pi * x) + std::cos(y / T(2.0) * pi), + T(1.0));
|
||||
}
|
||||
|
||||
static inline T func15(Type x, Type y)
|
||||
{
|
||||
return (((y + (x * 2.2)) <= (x + y + 1.1)) ? x - y : x * y) + T(2.0) * pi / x;
|
||||
return std::max(T(3.33), std::min(sqrt(T(1.0) - std::sin(T(2.0) * x) + std::cos(pi / y) / T(3.0)), T(1.11)));
|
||||
}
|
||||
|
||||
static inline T func16(Type x, Type y)
|
||||
{
|
||||
return (((y + (x * T(2.2))) <= (x + y + T(1.1))) ? x - y : x * y) + T(2.0) * pi / x;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -308,6 +314,7 @@ int main()
|
|||
run_native_benchmark(x,y,native<double>::func13,expression_list[13]);
|
||||
run_native_benchmark(x,y,native<double>::func14,expression_list[14]);
|
||||
run_native_benchmark(x,y,native<double>::func15,expression_list[15]);
|
||||
run_native_benchmark(x,y,native<double>::func16,expression_list[16]);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -350,7 +357,7 @@ void pgo_primer()
|
|||
total += native<double>::func13(x,y);
|
||||
total += native<double>::func14(x,y);
|
||||
total += native<double>::func15(x,y);
|
||||
total += native<double>::func16(x,y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
351
exprtk_test.cpp
351
exprtk_test.cpp
|
@ -423,86 +423,118 @@ static const test_t test_list[] =
|
|||
test_t("equal(1.1,2.2)",0.0),
|
||||
test_t("not_equal(1.1,1.1)",0.0),
|
||||
test_t("not_equal(1.1,2.2)",1.0),
|
||||
test_t("1 and 1",1.0),
|
||||
test_t("1 and 0",0.0),
|
||||
test_t("0 and 1",0.0),
|
||||
test_t("0 and 0",0.0),
|
||||
test_t("1 and 1",1.0),
|
||||
test_t("1 and 0",0.0),
|
||||
test_t("0 and 1",0.0),
|
||||
test_t("0 and 0",0.0),
|
||||
test_t("1.0 and 1.0",1.0),
|
||||
test_t("1.0 and 0.0",0.0),
|
||||
test_t("0.0 and 1.0",0.0),
|
||||
test_t("0.0 and 0.0",0.0),
|
||||
test_t("(1 and 1)",1.0),
|
||||
test_t("(1 and 0)",0.0),
|
||||
test_t("(0 and 1)",0.0),
|
||||
test_t("(0 and 0)",0.0),
|
||||
test_t("(1.0 and 1.0)",1.0),
|
||||
test_t("(1.0 and 0.0)",0.0),
|
||||
test_t("(0.0 and 1.0)",0.0),
|
||||
test_t("(0.0 and 0.0)",0.0),
|
||||
test_t("1 or 1",1.0),
|
||||
test_t("1 or 0",1.0),
|
||||
test_t("0 or 1",1.0),
|
||||
test_t("0 or 0",0.0),
|
||||
test_t("1.0 or 1.0",1.0),
|
||||
test_t("1.0 or 0.0",1.0),
|
||||
test_t("0.0 or 1.0",1.0),
|
||||
test_t("0.0 or 0.0",0.0),
|
||||
test_t("(1 or 1)",1.0),
|
||||
test_t("(1 or 0)",1.0),
|
||||
test_t("(0 or 1)",1.0),
|
||||
test_t("(0 or 0)",0.0),
|
||||
test_t("(1.0 or 1.0)",1.0),
|
||||
test_t("(1.0 or 0.0)",1.0),
|
||||
test_t("(0.0 or 1.0)",1.0),
|
||||
test_t("(0.0 or 0.0)",0.0),
|
||||
test_t("1 nand 1",0.0),
|
||||
test_t("1 nand 0",1.0),
|
||||
test_t("0 nand 1",1.0),
|
||||
test_t("0 nand 0",1.0),
|
||||
test_t("1 or 1",1.0),
|
||||
test_t("1 or 0",1.0),
|
||||
test_t("0 or 1",1.0),
|
||||
test_t("0 or 0",0.0),
|
||||
test_t("1 nor 1",0.0),
|
||||
test_t("1 nor 0",0.0),
|
||||
test_t("0 nor 1",0.0),
|
||||
test_t("0 nor 0",1.0),
|
||||
test_t("0 xor 0",0.0),
|
||||
test_t("0 xor 1",1.0),
|
||||
test_t("1 xor 0",1.0),
|
||||
test_t("1 xor 1",0.0),
|
||||
test_t("1.0 and 1.0",1.0),
|
||||
test_t("1.0 and 0.0",0.0),
|
||||
test_t("0.0 and 1.0",0.0),
|
||||
test_t("0.0 and 0.0",0.0),
|
||||
test_t("1.0 nand 1.0",0.0),
|
||||
test_t("1.0 nand 0.0",1.0),
|
||||
test_t("0.0 nand 1.0",1.0),
|
||||
test_t("0.0 nand 0.0",1.0),
|
||||
test_t("1.0 or 1.0",1.0),
|
||||
test_t("1.0 or 0.0",1.0),
|
||||
test_t("0.0 or 1.0",1.0),
|
||||
test_t("0.0 or 0.0",0.0),
|
||||
test_t("1.0 nor 1.0",0.0),
|
||||
test_t("1.0 nor 0.0",0.0),
|
||||
test_t("0.0 nor 1.0",0.0),
|
||||
test_t("0.0 nor 0.0",1.0),
|
||||
test_t("0.0 xor 0.0",0.0),
|
||||
test_t("0.0 xor 1.0",1.0),
|
||||
test_t("1.0 xor 0.0",1.0),
|
||||
test_t("1.0 xor 1.0",0.0),
|
||||
test_t("(1 and 1)",1.0),
|
||||
test_t("(1 and 0)",0.0),
|
||||
test_t("(0 and 1)",0.0),
|
||||
test_t("(0 and 0)",0.0),
|
||||
test_t("(1 nand 1)",0.0),
|
||||
test_t("(1 nand 0)",1.0),
|
||||
test_t("(0 nand 1)",1.0),
|
||||
test_t("(0 nand 0)",1.0),
|
||||
test_t("(1 or 1)",1.0),
|
||||
test_t("(1 or 0)",1.0),
|
||||
test_t("(0 or 1)",1.0),
|
||||
test_t("(0 or 0)",0.0),
|
||||
test_t("(1 nor 1)",0.0),
|
||||
test_t("(1 nor 0)",0.0),
|
||||
test_t("(0 nor 1)",0.0),
|
||||
test_t("(0 nor 0)",1.0),
|
||||
test_t("(0 xor 0)",0.0),
|
||||
test_t("(0 xor 1)",1.0),
|
||||
test_t("(1 xor 0)",1.0),
|
||||
test_t("(1 xor 1)",0.0),
|
||||
test_t("(1.0 and 1.0)",1.0),
|
||||
test_t("(1.0 and 0.0)",0.0),
|
||||
test_t("(0.0 and 1.0)",0.0),
|
||||
test_t("(0.0 and 0.0)",0.0),
|
||||
test_t("(1.0 nand 1.0)",0.0),
|
||||
test_t("(1.0 nand 0.0)",1.0),
|
||||
test_t("(0.0 nand 1.0)",1.0),
|
||||
test_t("(0.0 nand 0.0)",1.0),
|
||||
test_t("(1.0 or 1.0)",1.0),
|
||||
test_t("(1.0 or 0.0)",1.0),
|
||||
test_t("(0.0 or 1.0)",1.0),
|
||||
test_t("(0.0 or 0.0)",0.0),
|
||||
test_t("(1.0 nor 1.0)",0.0),
|
||||
test_t("(1.0 nor 0.0)",0.0),
|
||||
test_t("(0.0 nor 1.0)",0.0),
|
||||
test_t("(0.0 nor 0.0)",1.0),
|
||||
test_t("1 nor 1",0.0),
|
||||
test_t("1 nor 0",0.0),
|
||||
test_t("0 nor 1",0.0),
|
||||
test_t("0 nor 0",1.0),
|
||||
test_t("1.0 nor 1.0",0.0),
|
||||
test_t("1.0 nor 0.0",0.0),
|
||||
test_t("0.0 nor 1.0",0.0),
|
||||
test_t("0.0 nor 0.0",1.0),
|
||||
test_t("(1 nor 1)",0.0),
|
||||
test_t("(1 nor 0)",0.0),
|
||||
test_t("(0 nor 1)",0.0),
|
||||
test_t("(0 nor 0)",1.0),
|
||||
test_t("(1.0 nor 1.0)",0.0),
|
||||
test_t("(1.0 nor 0.0)",0.0),
|
||||
test_t("(0.0 nor 1.0)",0.0),
|
||||
test_t("(0.0 nor 0.0)",1.0),
|
||||
test_t("0 xor 0",0.0),
|
||||
test_t("0 xor 1",1.0),
|
||||
test_t("1 xor 0",1.0),
|
||||
test_t("1 xor 1",0.0),
|
||||
test_t("0.0 xor 0.0",0.0),
|
||||
test_t("0.0 xor 1.0",1.0),
|
||||
test_t("1.0 xor 0.0",1.0),
|
||||
test_t("1.0 xor 1.0",0.0),
|
||||
test_t("(0 xor 0)",0.0),
|
||||
test_t("(0 xor 1)",1.0),
|
||||
test_t("(1 xor 0)",1.0),
|
||||
test_t("(1 xor 1)",0.0),
|
||||
test_t("(0.0 xor 0.0)",0.0),
|
||||
test_t("(0.0 xor 1.0)",1.0),
|
||||
test_t("(1.0 xor 0.0)",1.0),
|
||||
test_t("(1.0 xor 1.0)",0.0),
|
||||
test_t("1 & 1",1.0),
|
||||
test_t("1 & 0",0.0),
|
||||
test_t("0 & 1",0.0),
|
||||
test_t("0 & 0",0.0),
|
||||
test_t("1.0 & 1.0",1.0),
|
||||
test_t("1.0 & 0.0",0.0),
|
||||
test_t("0.0 & 1.0",0.0),
|
||||
test_t("0.0 & 0.0",0.0),
|
||||
test_t("(1 & 1)",1.0),
|
||||
test_t("(1 & 0)",0.0),
|
||||
test_t("(0 & 1)",0.0),
|
||||
test_t("(0 & 0)",0.0),
|
||||
test_t("(1.0 & 1.0)",1.0),
|
||||
test_t("(1.0 & 0.0)",0.0),
|
||||
test_t("(0.0 & 1.0)",0.0),
|
||||
test_t("(0.0 & 0.0)",0.0),
|
||||
test_t("1 | 1",1.0),
|
||||
test_t("1 | 0",1.0),
|
||||
test_t("0 | 1",1.0),
|
||||
test_t("0 | 0",0.0),
|
||||
test_t("1.0 | 1.0",1.0),
|
||||
test_t("1.0 | 0.0",1.0),
|
||||
test_t("0.0 | 1.0",1.0),
|
||||
test_t("0.0 | 0.0",0.0),
|
||||
test_t("(1 | 1)",1.0),
|
||||
test_t("(1 | 0)",1.0),
|
||||
test_t("(0 | 1)",1.0),
|
||||
test_t("(0 | 0)",0.0),
|
||||
test_t("(1.0 | 1.0)",1.0),
|
||||
test_t("(1.0 | 0.0)",1.0),
|
||||
test_t("(0.0 | 1.0)",1.0),
|
||||
test_t("(0.0 | 0.0)",0.0),
|
||||
test_t("(1 nand 1) == not(1 and 1)",1.0),
|
||||
test_t("(1 nand 0) == not(1 and 0)",1.0),
|
||||
test_t("(0 nand 1) == not(0 and 1)",1.0),
|
||||
|
@ -511,6 +543,30 @@ static const test_t test_list[] =
|
|||
test_t("(1 nor 0) == not(1 or 0)",1.0),
|
||||
test_t("(0 nor 1) == not(0 or 1)",1.0),
|
||||
test_t("(0 nor 0) == not(0 or 0)",1.0),
|
||||
test_t("(1.0 nand 1.0) == not(1.0 and 1.0)",1.0),
|
||||
test_t("(1.0 nand 0.0) == not(1.0 and 0.0)",1.0),
|
||||
test_t("(0.0 nand 1.0) == not(0.0 and 1.0)",1.0),
|
||||
test_t("(0.0 nand 0.0) == not(0.0 and 0.0)",1.0),
|
||||
test_t("(1.0 nor 1.0) == not(1.0 or 1.0)",1.0),
|
||||
test_t("(1.0 nor 0.0) == not(1.0 or 0.0)",1.0),
|
||||
test_t("(0.0 nor 1.0) == not(0.0 or 1.0)",1.0),
|
||||
test_t("(0.0 nor 0.0) == not(0.0 or 0.0)",1.0),
|
||||
test_t("(1 nand 1) == not(1 & 1)",1.0),
|
||||
test_t("(1 nand 0) == not(1 & 0)",1.0),
|
||||
test_t("(0 nand 1) == not(0 & 1)",1.0),
|
||||
test_t("(0 nand 0) == not(0 & 0)",1.0),
|
||||
test_t("(1 nor 1) == not(1 | 1)",1.0),
|
||||
test_t("(1 nor 0) == not(1 | 0)",1.0),
|
||||
test_t("(0 nor 1) == not(0 | 1)",1.0),
|
||||
test_t("(0 nor 0) == not(0 | 0)",1.0),
|
||||
test_t("(1.0 nand 1.0) == not(1.0 & 1.0)",1.0),
|
||||
test_t("(1.0 nand 0.0) == not(1.0 & 0.0)",1.0),
|
||||
test_t("(0.0 nand 1.0) == not(0.0 & 1.0)",1.0),
|
||||
test_t("(0.0 nand 0.0) == not(0.0 & 0.0)",1.0),
|
||||
test_t("(1.0 nor 1.0) == not(1.0 | 1.0)",1.0),
|
||||
test_t("(1.0 nor 0.0) == not(1.0 | 0.0)",1.0),
|
||||
test_t("(0.0 nor 1.0) == not(0.0 | 1.0)",1.0),
|
||||
test_t("(0.0 nor 0.0) == not(0.0 | 0.0)",1.0),
|
||||
test_t("abs(1)",1.0),
|
||||
test_t("abs(-1)",1.0),
|
||||
test_t("abs(1.0)",1.0),
|
||||
|
@ -637,6 +693,14 @@ static const test_t test_list[] =
|
|||
test_t("(false and true) == false",1.0),
|
||||
test_t("(true or false) == true",1.0),
|
||||
test_t("(false or true) == true",1.0),
|
||||
test_t("(true & true) == true",1.0),
|
||||
test_t("(false & false) == false",1.0),
|
||||
test_t("(true | true) == true",1.0),
|
||||
test_t("(false | false) == false",1.0),
|
||||
test_t("(true & false) == false",1.0),
|
||||
test_t("(false & true) == false",1.0),
|
||||
test_t("(true | false) == true",1.0),
|
||||
test_t("(false | true) == true",1.0),
|
||||
test_t("clamp(-1,1,+1)",1.0),
|
||||
test_t("clamp(-1,-1.5,+1.0)",-1.0),
|
||||
test_t("clamp(-1,+1.5,+1.0)",+1.0),
|
||||
|
@ -773,7 +837,16 @@ static const test_t test_list[] =
|
|||
test_t("1/1*1/2*1/3*1/4*1/5*1/6*1/7*1/8*1/9",0.00000275573192239859),
|
||||
test_t("(1/1)*(1/2)*(1/3)*(1/4)*(1/5)*(1/6)*(1/7)*(1/8)*(1/9)",0.00000275573192239859),
|
||||
test_t("1.0/1.0*1.0/2.0*1.0/3.0*1.0/4.0*1.0/5.0*1.0/6.0*1.0/7.0*1.0/8.0*1.0/9",0.00000275573192239859),
|
||||
test_t("(1.0/1.0)*(1.0/2.0)*(1.0/3.0)*(1.0/4.0)*(1.0/5.0)*(1.0/6.0)*(1.0/7.0)*(1.0/8.0)*(1.0/9)",0.00000275573192239859)
|
||||
test_t("(1.0/1.0)*(1.0/2.0)*(1.0/3.0)*(1.0/4.0)*(1.0/5.0)*(1.0/6.0)*(1.0/7.0)*(1.0/8.0)*(1.0/9)",0.00000275573192239859),
|
||||
test_t("equal(poly01(1.2345,2.2,1.1),(2.2*1.2345^1+1.1))",1.0),
|
||||
test_t("equal(poly02(1.2345,3.3,2.2,1.1),(3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
|
||||
test_t("equal(poly03(1.2345,4.4,3.3,2.2,1.1),(4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
|
||||
test_t("equal(poly04(1.2345,5.5,4.4,3.3,2.2,1.1),(5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
|
||||
test_t("equal(poly05(1.2345,6.6,5.5,4.4,3.3,2.2,1.1),(6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
|
||||
test_t("equal(poly06(1.2345,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
|
||||
test_t("equal(poly07(1.2345,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(8.8*1.2345^7+7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
|
||||
test_t("equal(poly08(1.2345,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(9.9*1.2345^8+8.8*1.2345^7+7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
|
||||
test_t("equal(poly09(1.2345,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(1.1*1.2345^9+9.9*1.2345^8+8.8*1.2345^7+7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0)
|
||||
};
|
||||
|
||||
static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_t);
|
||||
|
@ -808,6 +881,32 @@ inline bool test_expression(const std::string& expression_string, const T& expec
|
|||
exprtk::symbol_table<T> symbol_table;
|
||||
symbol_table.add_constants();
|
||||
|
||||
exprtk::polynomial<T, 1> poly01;
|
||||
exprtk::polynomial<T, 2> poly02;
|
||||
exprtk::polynomial<T, 3> poly03;
|
||||
exprtk::polynomial<T, 4> poly04;
|
||||
exprtk::polynomial<T, 5> poly05;
|
||||
exprtk::polynomial<T, 6> poly06;
|
||||
exprtk::polynomial<T, 7> poly07;
|
||||
exprtk::polynomial<T, 8> poly08;
|
||||
exprtk::polynomial<T, 9> poly09;
|
||||
exprtk::polynomial<T,10> poly10;
|
||||
exprtk::polynomial<T,11> poly11;
|
||||
exprtk::polynomial<T,12> poly12;
|
||||
|
||||
symbol_table.add_function("poly01", poly01);
|
||||
symbol_table.add_function("poly02", poly02);
|
||||
symbol_table.add_function("poly03", poly03);
|
||||
symbol_table.add_function("poly04", poly04);
|
||||
symbol_table.add_function("poly05", poly05);
|
||||
symbol_table.add_function("poly06", poly06);
|
||||
symbol_table.add_function("poly07", poly07);
|
||||
symbol_table.add_function("poly08", poly08);
|
||||
symbol_table.add_function("poly09", poly09);
|
||||
symbol_table.add_function("poly10", poly10);
|
||||
symbol_table.add_function("poly11", poly11);
|
||||
symbol_table.add_function("poly12", poly12);
|
||||
|
||||
exprtk::expression<T> expression;
|
||||
expression.register_symbol_table(symbol_table);
|
||||
|
||||
|
@ -2384,9 +2483,9 @@ inline bool run_test12()
|
|||
"equal(poly06(x,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
|
||||
"equal(poly07(x,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
|
||||
"equal(poly08(x,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
|
||||
"equal(poly09(x,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))"
|
||||
"equal(poly10(x,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))"
|
||||
"equal(poly11(x,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))"
|
||||
"equal(poly09(x,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
|
||||
"equal(poly10(x,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
|
||||
"equal(poly11(x,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
|
||||
"equal(poly12(x,4.4,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(4.4x^12+3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))"
|
||||
};
|
||||
static const std::size_t expression_string_size = sizeof(expression_string) / sizeof(std::string);
|
||||
|
@ -2583,6 +2682,8 @@ inline bool run_test14()
|
|||
exprtk::polynomial<T, 8> poly08;
|
||||
exprtk::polynomial<T, 9> poly09;
|
||||
exprtk::polynomial<T,10> poly10;
|
||||
exprtk::polynomial<T,11> poly11;
|
||||
exprtk::polynomial<T,12> poly12;
|
||||
|
||||
exprtk::symbol_table<T> symbol_table;
|
||||
symbol_table.add_constants();
|
||||
|
@ -2590,21 +2691,23 @@ inline bool run_test14()
|
|||
symbol_table.add_variable("y",y);
|
||||
symbol_table.add_variable("z",z);
|
||||
symbol_table.add_variable("w",w);
|
||||
symbol_table.add_function( "poly1", poly01);
|
||||
symbol_table.add_function( "poly2", poly02);
|
||||
symbol_table.add_function( "poly3", poly03);
|
||||
symbol_table.add_function( "poly4", poly04);
|
||||
symbol_table.add_function( "poly5", poly05);
|
||||
symbol_table.add_function( "poly6", poly06);
|
||||
symbol_table.add_function( "poly7", poly07);
|
||||
symbol_table.add_function( "poly8", poly08);
|
||||
symbol_table.add_function( "poly9", poly09);
|
||||
symbol_table.add_function("poly01", poly01);
|
||||
symbol_table.add_function("poly02", poly02);
|
||||
symbol_table.add_function("poly03", poly03);
|
||||
symbol_table.add_function("poly04", poly04);
|
||||
symbol_table.add_function("poly05", poly05);
|
||||
symbol_table.add_function("poly06", poly06);
|
||||
symbol_table.add_function("poly07", poly07);
|
||||
symbol_table.add_function("poly08", poly08);
|
||||
symbol_table.add_function("poly09", poly09);
|
||||
symbol_table.add_function("poly10", poly10);
|
||||
symbol_table.add_function("poly11", poly11);
|
||||
symbol_table.add_function("poly12", poly12);
|
||||
|
||||
expression_t expression;
|
||||
expression.register_symbol_table(symbol_table);
|
||||
|
||||
exprtk::parser<double> parser;
|
||||
exprtk::parser<T> parser;
|
||||
|
||||
std::deque<std::string> expr_str_list;
|
||||
|
||||
|
@ -2613,7 +2716,7 @@ inline bool run_test14()
|
|||
return true;
|
||||
}
|
||||
|
||||
std::deque<exprtk::expression<double> > expression_list;
|
||||
std::deque<exprtk::expression<T> > expression_list;
|
||||
bool failure = false;
|
||||
static const std::size_t rounds = 5;
|
||||
|
||||
|
@ -2621,7 +2724,7 @@ inline bool run_test14()
|
|||
{
|
||||
for (std::size_t i = 0; i < expr_str_list.size(); ++i)
|
||||
{
|
||||
exprtk::expression<double> current_expression;
|
||||
exprtk::expression<T> current_expression;
|
||||
|
||||
current_expression.register_symbol_table(symbol_table);
|
||||
|
||||
|
@ -2638,7 +2741,7 @@ inline bool run_test14()
|
|||
|
||||
for (std::size_t i = 0; i < expression_list.size(); ++i)
|
||||
{
|
||||
double result = expression_list[i].value();
|
||||
T result = expression_list[i].value();
|
||||
if (result != T(1))
|
||||
{
|
||||
failure = true;
|
||||
|
@ -2656,6 +2759,99 @@ inline bool run_test14()
|
|||
return !failure;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline bool run_test15()
|
||||
{
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
|
||||
T x = T(1.1);
|
||||
T y = T(2.2);
|
||||
T z = T(3.3);
|
||||
|
||||
exprtk::symbol_table<T> symbol_table;
|
||||
symbol_table.add_constants();
|
||||
symbol_table.add_variable("x",x);
|
||||
symbol_table.add_variable("y",y);
|
||||
symbol_table.add_variable("z",z);
|
||||
|
||||
std::deque<std::string> expr_str_list;
|
||||
|
||||
expr_str_list.push_back("2 - (x + y) / z//Comment 01 ");
|
||||
expr_str_list.push_back("2 - (x + y) / z#Comment 02 ");
|
||||
expr_str_list.push_back("2 - (x + y) / z //Comment 03 ");
|
||||
expr_str_list.push_back("2 - (x + y) / z #Comment 04 ");
|
||||
expr_str_list.push_back("2 - (x + y) / z//Comment 05 \n");
|
||||
expr_str_list.push_back("2 - (x + y) / z#Comment 06 \n");
|
||||
expr_str_list.push_back("2 - (x + y) / z //Comment 07\n");
|
||||
expr_str_list.push_back("2 - (x + y) / z #Comment 08 \n");
|
||||
expr_str_list.push_back("/* Comment 09*/2 - (x + y) / z");
|
||||
expr_str_list.push_back("/* Comment 10*/2 - (x + y) / z\n");
|
||||
expr_str_list.push_back("/* Comment 11*/2 - (x + y) / z/* Comment 12*/");
|
||||
expr_str_list.push_back("/* Comment 13*/2 - (x + y) / z/* Comment 14*/\n");
|
||||
expr_str_list.push_back("2 - /* Comment 15 */(x + y) / z");
|
||||
expr_str_list.push_back("2 - /* Comment 15 */(x + y) /* Comment 16 *// z \n");
|
||||
expr_str_list.push_back("2 - /* Comment 17 */(x + y) /* Comment 18 */ / z //Comment 19\n");
|
||||
expr_str_list.push_back("2 - /* Comment 20 */(x + y) /* Comment 21 */ / z #Comment 22\n");
|
||||
expr_str_list.push_back("2 - /* Comment 23 */(x + y) /* Comment 24 */ / z //Comment 25");
|
||||
expr_str_list.push_back("2 - /* Comment 26 */(x + y) /* Comment 27 */ / z #Comment 28");
|
||||
|
||||
std::deque<expression_t> expression_list;
|
||||
|
||||
for (std::size_t i = 0; i < expr_str_list.size(); ++i)
|
||||
{
|
||||
expression_t expression;
|
||||
expression.register_symbol_table(symbol_table);
|
||||
|
||||
exprtk::parser<T> parser;
|
||||
|
||||
if (!parser.compile(expr_str_list[i],expression))
|
||||
{
|
||||
printf("run_test15() - Error: %s Expression: %s\n",
|
||||
parser.error().c_str(),
|
||||
expr_str_list[i].c_str());
|
||||
return false;
|
||||
}
|
||||
else
|
||||
expression_list.push_back(expression);
|
||||
}
|
||||
|
||||
expression_t base_expression;
|
||||
const std::string base_expr_str = "2 - (x + y) / z";
|
||||
|
||||
{
|
||||
base_expression.register_symbol_table(symbol_table);
|
||||
|
||||
exprtk::parser<T> parser;
|
||||
|
||||
if (!parser.compile(base_expr_str,base_expression))
|
||||
{
|
||||
printf("run_test15() - Error: %s Expression: %s\n",
|
||||
parser.error().c_str(),
|
||||
base_expr_str.c_str());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool failure = false;
|
||||
|
||||
for (std::size_t i = 0; i < expression_list.size(); ++i)
|
||||
{
|
||||
T base_result = base_expression.value();
|
||||
T result = expression_list[i].value();
|
||||
|
||||
if (not_equal(base_result,result))
|
||||
{
|
||||
printf("run_test15() - Error in evaluation! (1) Base: %20.10f\tResult: %20.10f\tExpression: %s\n",
|
||||
base_result,
|
||||
result,
|
||||
expr_str_list[i].c_str());
|
||||
failure = true;
|
||||
}
|
||||
}
|
||||
|
||||
return !failure;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
#define perform_test(Type,Number) \
|
||||
|
@ -2688,6 +2884,7 @@ int main()
|
|||
perform_test(double,12)
|
||||
perform_test(double,13)
|
||||
perform_test(double,14)
|
||||
perform_test(double,15)
|
||||
|
||||
#undef perform_test
|
||||
|
||||
|
|
10
readme.txt
10
readme.txt
|
@ -140,11 +140,11 @@ Expression Library can be found at:
|
|||
+-----------+--------------------------------------------------------+
|
||||
| <> or != | True only if x does not equal y (eg: x <> y or x != y) |
|
||||
+-----------+--------------------------------------------------------+
|
||||
| < | True only if x less than y. (eg: x < y) |
|
||||
| < | True only if x is less than y. (eg: x < y) |
|
||||
+-----------+--------------------------------------------------------+
|
||||
| <= | True only if x less than or equal to y. (eg: x <= y) |
|
||||
| <= | True only if x is less than or equal to y. (eg: x <= y)|
|
||||
+-----------+--------------------------------------------------------+
|
||||
| > | True only if x greater than y. (eg: x > y) |
|
||||
| > | True only if x is greater than y. (eg: x > y) |
|
||||
+-----------+--------------------------------------------------------+
|
||||
| >= | True only if x greater than or equal to y (eg: x >= y) |
|
||||
+-----------+--------------------------------------------------------+
|
||||
|
@ -219,6 +219,10 @@ Expression Library can be found at:
|
|||
| logn | Base N logarithm of x (eg: logn(1235,8)) |
|
||||
| | where n > 0 and is an integer. |
|
||||
+-----------+--------------------------------------------------------+
|
||||
| max | Largest value of all the inputs. (eg: max(x,y,z,w)) |
|
||||
+-----------+--------------------------------------------------------+
|
||||
| min | Smallest value of all the inputs. (eg: min(x,y,z,w)) |
|
||||
+-----------+--------------------------------------------------------+
|
||||
| nequal | Not-equal test between x and y using normalized epsilon|
|
||||
+-----------+--------------------------------------------------------+
|
||||
| root | Nth-Root of x (eg: root(x,3)) |
|
||||
|
|
Loading…
Reference in New Issue