C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html
This commit is contained in:
parent
399a5f9aa3
commit
f2de4424d3
20
exprtk.hpp
20
exprtk.hpp
|
@ -175,7 +175,7 @@ namespace exprtk
|
|||
return result;
|
||||
}
|
||||
|
||||
inline void cleanup_espaces(std::string& s)
|
||||
inline void cleanup_escapes(std::string& s)
|
||||
{
|
||||
std::string::iterator itr1 = s.begin();
|
||||
std::string::iterator itr2 = s.begin();
|
||||
|
@ -604,7 +604,7 @@ namespace exprtk
|
|||
template <typename T>
|
||||
inline T round_impl(const T v, real_type_tag)
|
||||
{
|
||||
return ((v < T(0)) ? std::ceil(v - T(0.5)) : floor(v + T(0.5)));
|
||||
return ((v < T(0)) ? std::ceil(v - T(0.5)) : std::floor(v + T(0.5)));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
@ -2052,7 +2052,7 @@ namespace exprtk
|
|||
else
|
||||
{
|
||||
std::string parsed_string(begin,s_itr_);
|
||||
details::cleanup_espaces(parsed_string);
|
||||
details::cleanup_escapes(parsed_string);
|
||||
t.set_string(parsed_string, std::distance(base_itr_,begin));
|
||||
}
|
||||
|
||||
|
@ -9124,7 +9124,7 @@ namespace exprtk
|
|||
inline std::size_t variable_count() const
|
||||
{
|
||||
if (valid())
|
||||
return local_data().variable_store().size;
|
||||
return local_data().variable_store.size;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
@ -9133,7 +9133,7 @@ namespace exprtk
|
|||
inline std::size_t stringvar_count() const
|
||||
{
|
||||
if (valid())
|
||||
return local_data().stringvar_store().size;
|
||||
return local_data().stringvar_store.size;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
@ -9142,7 +9142,7 @@ namespace exprtk
|
|||
inline std::size_t function_count() const
|
||||
{
|
||||
if (valid())
|
||||
return local_data().function_store().size;
|
||||
return local_data().function_store.size;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
@ -9150,7 +9150,7 @@ namespace exprtk
|
|||
inline std::size_t vector_count() const
|
||||
{
|
||||
if (valid())
|
||||
return local_data().vector_store().size;
|
||||
return local_data().vector_store.size;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
@ -16607,11 +16607,7 @@ namespace exprtk
|
|||
#else
|
||||
inline expression_node_ptr synthesize_string_expression(const details::operator_type&, expression_node_ptr (&)[3])
|
||||
{
|
||||
if ((0 == branch[0]) || (0 == branch[1]) || (0 == branch[2]))
|
||||
{
|
||||
details::free_all_nodes(*node_allocator_,branch);
|
||||
return error_node();
|
||||
}
|
||||
details::free_all_nodes(*node_allocator_,branch);
|
||||
return error_node();
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1727,6 +1727,14 @@ inline bool run_test03()
|
|||
symbol_table.add_variable(variable_list[i],v[i]);
|
||||
}
|
||||
|
||||
if (variable_list_size != symbol_table.variable_count())
|
||||
{
|
||||
printf("run_test03() - Error - Invalid number of variables in symbol_table! Expected: %d got: %d\n",
|
||||
static_cast<unsigned int>(variable_list_size),
|
||||
static_cast<unsigned int>(symbol_table.variable_count()));
|
||||
return false;
|
||||
}
|
||||
|
||||
symbol_table.add_constants();
|
||||
|
||||
expression.register_symbol_table(symbol_table);
|
||||
|
@ -1761,8 +1769,8 @@ inline bool run_test04()
|
|||
exprtk::symbol_table<T> symbol_table;
|
||||
exprtk::expression<T> expression;
|
||||
|
||||
T x = T(-1000.0);
|
||||
T y = T(-1000.0);
|
||||
T x = T(-1000);
|
||||
T y = T(-1000);
|
||||
|
||||
symbol_table.add_variable("x",x);
|
||||
symbol_table.add_variable("y",y);
|
||||
|
@ -1785,7 +1793,7 @@ inline bool run_test04()
|
|||
const T pi = T(3.14159265358979323846);
|
||||
const T increment = T(0.0001);
|
||||
|
||||
while ((x <= T(+1000.0)) && (y <= T(+1000.0)))
|
||||
while ((x <= T(+1000)) && (y <= T(+1000)))
|
||||
{
|
||||
T result1 = expression.value();
|
||||
T result2 = clamp<T>(-1.0,std::sin(2 * pi * x) + std::cos(y / 2 * pi),+1.0);
|
||||
|
@ -1817,8 +1825,8 @@ inline bool run_test05()
|
|||
exprtk::symbol_table<T> symbol_table;
|
||||
std::deque<expression_t> expression_list;
|
||||
|
||||
T x = T(-1000.0);
|
||||
T y = T(-1000.0);
|
||||
T x = T(-1000);
|
||||
T y = T(-1000);
|
||||
|
||||
symbol_table.add_variable("x_var123",x);
|
||||
symbol_table.add_variable("y_var123",y);
|
||||
|
@ -1845,7 +1853,7 @@ inline bool run_test05()
|
|||
const T pi = T(3.14159265358979323846);
|
||||
const T increment = T(0.001);
|
||||
|
||||
while ((x <= T(+1000.0)) && (y <= T(+1000.0)))
|
||||
while ((x <= T(+1000)) && (y <= T(+1000)))
|
||||
{
|
||||
T real_result = clamp<T>(-1.0,std::sin(2 * pi * x) + std::cos(y / 2 * pi),+1.0);
|
||||
|
||||
|
@ -1881,7 +1889,7 @@ inline bool run_test06()
|
|||
typedef exprtk::expression<T> expression_t;
|
||||
std::string expression_string = "sqrt(1 - (x^2))";
|
||||
|
||||
T x = T(0.0);
|
||||
T x = T(0);
|
||||
|
||||
exprtk::symbol_table<T> symbol_table;
|
||||
symbol_table.add_variable("x",x);
|
||||
|
@ -1899,8 +1907,8 @@ inline bool run_test06()
|
|||
return false;
|
||||
}
|
||||
|
||||
T total_area1 = exprtk::integrate(expression,x,T(-1.0),T(1.0));
|
||||
T total_area2 = exprtk::integrate(expression,"x",T(-1.0),T(1.0));
|
||||
T total_area1 = exprtk::integrate(expression,x,T(-1),T(1));
|
||||
T total_area2 = exprtk::integrate(expression,"x",T(-1),T(1));
|
||||
const T pi = T(3.14159265358979323846);
|
||||
|
||||
if (not_equal(total_area1,total_area2,T(0.000001)))
|
||||
|
@ -1909,10 +1917,10 @@ inline bool run_test06()
|
|||
return false;
|
||||
}
|
||||
|
||||
if (not_equal(total_area1,T(pi)/T(2.0),T(0.000001)))
|
||||
if (not_equal(total_area1,T(pi) / T(2),T(0.000001)))
|
||||
{
|
||||
printf("run_test06() - Integration Error: Expected: %19.15f\tResult: %19.15f\n",
|
||||
pi/T(2.0),
|
||||
pi / T(2),
|
||||
total_area1);
|
||||
return false;
|
||||
}
|
||||
|
@ -1924,9 +1932,9 @@ template <typename T>
|
|||
inline bool run_test07()
|
||||
{
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
std::string expression_string = "sin(2x+1/3)";
|
||||
std::string expression_string = "sin(2x + 1 / 3)";
|
||||
|
||||
T x = T(0.0);
|
||||
T x = T(0);
|
||||
|
||||
exprtk::symbol_table<T> symbol_table;
|
||||
symbol_table.add_variable("x",x);
|
||||
|
@ -1945,10 +1953,10 @@ inline bool run_test07()
|
|||
return false;
|
||||
}
|
||||
|
||||
for (x = T(-200.0); x < T(200); x += T(0.0001))
|
||||
for (x = T(-200); x < T(200); x += T(0.0001))
|
||||
{
|
||||
{
|
||||
T deriv1_real_result = T(2.0) * std::cos(T(2.0) * x + T(1.0/3.0));
|
||||
T deriv1_real_result = T(2) * std::cos(T(2) * x + T(1.0/3.0));
|
||||
T deriv1_result1 = exprtk::derivative(expression,x);
|
||||
T deriv1_result2 = exprtk::derivative(expression,"x");
|
||||
|
||||
|
@ -1969,7 +1977,7 @@ inline bool run_test07()
|
|||
}
|
||||
|
||||
{
|
||||
T deriv2_real_result = T(-4.0) * std::sin(T(2.0) * x + T(1.0/3.0));
|
||||
T deriv2_real_result = T(-4) * std::sin(T(2) * x + T(1.0/3.0));
|
||||
T deriv2_result1 = exprtk::second_derivative(expression,x);
|
||||
T deriv2_result2 = exprtk::second_derivative(expression,"x");
|
||||
|
||||
|
@ -1990,7 +1998,7 @@ inline bool run_test07()
|
|||
}
|
||||
|
||||
{
|
||||
T deriv3_real_result = T(-8.0) * std::cos(T(2.0) * x + T(1.0/3.0));
|
||||
T deriv3_real_result = T(-8) * std::cos(T(2) * x + T(1.0/3.0));
|
||||
T deriv3_result1 = exprtk::third_derivative(expression,x);
|
||||
T deriv3_result2 = exprtk::third_derivative(expression,"x");
|
||||
|
||||
|
@ -2230,8 +2238,8 @@ inline bool run_test09()
|
|||
"myfunc6(sin(x*pi),y/2)+myfunc7(sin(x*pi),y/2)+"
|
||||
"myfunc8(sin(x*pi),y/2)+myfunc9(sin(x*pi),y/2)";
|
||||
|
||||
T x = T(1.0) + (i/T(10000.0));
|
||||
T y = T(2.0) + (i/T(10000.0));
|
||||
T x = T(1) + (i / T(10000));
|
||||
T y = T(2) + (i / T(10000));
|
||||
myfunc<T> mf;
|
||||
|
||||
exprtk::symbol_table<T> symbol_table;
|
||||
|
@ -2266,18 +2274,18 @@ inline bool run_test09()
|
|||
|
||||
T result = expression.value();
|
||||
|
||||
T expected = T(4.0) *
|
||||
T expected = T(4) *
|
||||
(
|
||||
mf(sin(x*pi),y/T(2.0)) +
|
||||
mf(sin(x*pi),y/T(2.0)) +
|
||||
mf(sin(x*pi),y/T(2.0)) +
|
||||
mf(sin(x*pi),y/T(2.0)) +
|
||||
mf(sin(x*pi),y/T(2.0)) +
|
||||
mf(sin(x*pi),y/T(2.0)) +
|
||||
mf(sin(x*pi),y/T(2.0)) +
|
||||
mf(sin(x*pi),y/T(2.0)) +
|
||||
mf(sin(x*pi),y/T(2.0)) +
|
||||
mf(sin(x*pi),y/T(2.0))
|
||||
mf(sin(x*pi),y / T(2)) +
|
||||
mf(sin(x*pi),y / T(2)) +
|
||||
mf(sin(x*pi),y / T(2)) +
|
||||
mf(sin(x*pi),y / T(2)) +
|
||||
mf(sin(x*pi),y / T(2)) +
|
||||
mf(sin(x*pi),y / T(2)) +
|
||||
mf(sin(x*pi),y / T(2)) +
|
||||
mf(sin(x*pi),y / T(2)) +
|
||||
mf(sin(x*pi),y / T(2)) +
|
||||
mf(sin(x*pi),y / T(2))
|
||||
);
|
||||
|
||||
if (not_equal(result,expected,T(0.0000001)))
|
||||
|
@ -2639,8 +2647,8 @@ inline bool run_test10()
|
|||
|
||||
for (std::size_t r = 0; r < rounds; ++r)
|
||||
{
|
||||
symbol_table.add_stringvar("i", i);
|
||||
symbol_table.add_stringvar("j", j);
|
||||
symbol_table.add_stringvar( "i", i);
|
||||
symbol_table.add_stringvar( "j", j);
|
||||
symbol_table.add_stringvar("ii",ii);
|
||||
symbol_table.add_stringvar("jj",jj);
|
||||
|
||||
|
@ -2657,7 +2665,13 @@ inline bool run_test10()
|
|||
|
||||
if (stringvar_list.size() != expected_var_list.size())
|
||||
{
|
||||
printf("run_test10() - Failed to get stringvar list (3)\n");
|
||||
printf("run_test10() - Failed to get stringvar list (3.0)\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (symbol_table.stringvar_count() != expected_var_list.size())
|
||||
{
|
||||
printf("run_test10() - Failed to get stringvar list (3.1)\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -2829,7 +2843,7 @@ inline bool run_test11()
|
|||
}
|
||||
}
|
||||
|
||||
if (not_equal(expression.value(),(x + y)/T(3.0),T(0.000001)))
|
||||
if (not_equal(expression.value(),(x + y) / T(3),T(0.000001)))
|
||||
{
|
||||
printf("run_test11() - Error in evaluation!(1)\n");
|
||||
return false;
|
||||
|
@ -2857,7 +2871,7 @@ inline bool run_test11()
|
|||
|
||||
expression.value();
|
||||
|
||||
if (not_equal(expression.value(),(x + y)/T(3.0),T(0.000001)))
|
||||
if (not_equal(expression.value(),(x + y) / T(3),T(0.000001)))
|
||||
{
|
||||
printf("run_test11() - Error in evaluation!(3)\n");
|
||||
return false;
|
||||
|
@ -2959,7 +2973,7 @@ inline bool run_test12()
|
|||
}
|
||||
}
|
||||
|
||||
if (T(1.0) != expression.value())
|
||||
if (T(1) != expression.value())
|
||||
{
|
||||
printf("run_test12() - Error in evaluation! Expression: %s\n",expr_str.c_str());
|
||||
return false;
|
||||
|
@ -2977,7 +2991,7 @@ struct sine_deg : public exprtk::ifunction<T>
|
|||
|
||||
inline T operator()(const T& v)
|
||||
{
|
||||
return std::sin((v * T(exprtk::details::numeric::constant::pi))/T(180.0));
|
||||
return std::sin((v * T(exprtk::details::numeric::constant::pi)) / T(180));
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -2988,7 +3002,7 @@ struct cosine_deg : public exprtk::ifunction<T>
|
|||
|
||||
inline T operator()(const T& v)
|
||||
{
|
||||
return std::cos((v * T(exprtk::details::numeric::constant::pi))/T(180.0));
|
||||
return std::cos((v * T(exprtk::details::numeric::constant::pi)) / T(180));
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -3049,7 +3063,7 @@ inline bool run_test13()
|
|||
}
|
||||
}
|
||||
|
||||
if (T(1.0) != expression.value())
|
||||
if (T(1) != expression.value())
|
||||
{
|
||||
printf("run_test13() - Error in evaluation! Expression: %s\n",expr_str.c_str());
|
||||
return false;
|
||||
|
@ -3443,8 +3457,8 @@ inline bool run_test17()
|
|||
T v = T(6.6);
|
||||
T t = T(7.7);
|
||||
|
||||
T one = T(1.0);
|
||||
T zero = T(0.0);
|
||||
T one = T(1);
|
||||
T zero = T(0);
|
||||
|
||||
exprtk::symbol_table<T> symbol_table;
|
||||
symbol_table.add_constants();
|
||||
|
|
Loading…
Reference in New Issue