C++ Mathematical Expression Library (ExprTk) https://www.partow.net/programming/exprtk/index.html
This commit is contained in:
parent
93a9f44f99
commit
17ba4d15e2
|
@ -6,6 +6,7 @@ jobs:
|
|||
- image: gcc:6
|
||||
steps:
|
||||
- checkout
|
||||
- run: c++ --version
|
||||
- run: make all -j 2
|
||||
- run: ./exprtk_test
|
||||
|
||||
|
@ -14,6 +15,7 @@ jobs:
|
|||
- image: gcc:7
|
||||
steps:
|
||||
- checkout
|
||||
- run: c++ --version
|
||||
- run: make all -j 2
|
||||
- run: ./exprtk_test
|
||||
|
||||
|
@ -22,6 +24,7 @@ jobs:
|
|||
- image: gcc:latest
|
||||
steps:
|
||||
- checkout
|
||||
- run: c++ --version
|
||||
- run: make all -j 2
|
||||
- run: ./exprtk_test
|
||||
|
||||
|
|
2
Makefile
2
Makefile
|
@ -2,7 +2,7 @@
|
|||
# **************************************************************
|
||||
# * C++ Mathematical Expression Toolkit Library *
|
||||
# * *
|
||||
# * Author: Arash Partow (1999-2020) *
|
||||
# * Author: Arash Partow (1999-2021) *
|
||||
# * URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
# * *
|
||||
# * Copyright notice: *
|
||||
|
|
6691
exprtk.hpp
6691
exprtk.hpp
File diff suppressed because it is too large
Load Diff
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* ExprTk vs Native Benchmarks *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -150,7 +150,7 @@ template <typename T>
|
|||
bool run_parse_benchmark(exprtk::symbol_table<T>& symbol_table)
|
||||
{
|
||||
static const std::size_t rounds = 100000;
|
||||
exprtk::parser<double> parser;
|
||||
exprtk::parser<double> parser;
|
||||
exprtk::expression<double> expression;
|
||||
|
||||
expression.register_symbol_table(symbol_table);
|
||||
|
@ -288,7 +288,7 @@ struct native
|
|||
}
|
||||
};
|
||||
|
||||
void pgo_primer();
|
||||
double pgo_primer();
|
||||
void perform_file_based_benchmark(const std::string& file_name, const std::size_t& rounds = 100000);
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
|
@ -359,7 +359,7 @@ int main(int argc, char* argv[])
|
|||
return 0;
|
||||
}
|
||||
|
||||
void pgo_primer()
|
||||
double pgo_primer()
|
||||
{
|
||||
exprtk::pgo_primer<double>();
|
||||
|
||||
|
@ -394,6 +394,8 @@ void pgo_primer()
|
|||
total += native<double>::func16(x,y);
|
||||
}
|
||||
}
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
std::size_t load_expression_file(const std::string& file_name, std::deque<std::string>& expression_list)
|
||||
|
@ -431,8 +433,8 @@ void perform_file_based_benchmark(const std::string& file_name, const std::size_
|
|||
}
|
||||
|
||||
typedef exprtk::symbol_table<double> symbol_table_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
typedef exprtk::parser<double> parser_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
typedef exprtk::parser<double> parser_t;
|
||||
|
||||
std::deque<expression_t> expression_list;
|
||||
|
||||
|
|
|
@ -8093,4 +8093,214 @@ equal(~{var xx[10^5] := [-3]; var yy[10^5] := [-4]; xx := 2 * abs((1 + xx) + (yy
|
|||
equal(~{var xx[10^5] := [-3]; var yy[10^5] := [-4]; xx := abs((xx + 1) + (yy + 1)) * 2; sum(xx) == 10^6},true)
|
||||
equal(~{var xx[10^5] := [-3]; var yy[10^5] := [-4]; xx := abs((1 + xx) + (1 + yy)) * 2; sum(xx) == 10^6},true)
|
||||
equal(~{var xx[10^5] := [-3]; var yy[10^5] := [-4]; xx := abs((xx + 1) + (1 + yy)) * 2; sum(xx) == 10^6},true)
|
||||
equal(~{var xx[10^5] := [-3]; var yy[10^5] := [-4]; xx := abs((1 + xx) + (yy + 1)) * 2; sum(xx) == 10^6},true)
|
||||
equal(~{var xx[10^5] := [-3]; var yy[10^5] := [-4]; xx := abs((1 + xx) + (yy + 1)) * 2; sum(xx) == 10^6},true)
|
||||
equal('abcd' like 'abcd*' ,true )
|
||||
equal('abcd' like 'abc*' ,true )
|
||||
equal('abcd' like 'ab*' ,true )
|
||||
equal('abcd' like 'a*' ,true )
|
||||
equal('abcd' like 'abc?' ,true )
|
||||
equal('a' like 'a*' ,true )
|
||||
equal('ab' like 'a*' ,true )
|
||||
equal('abcd' like 'abcd*' ,true )
|
||||
equal('' like '' ,true )
|
||||
equal('abcd' like 'abcd' ,true )
|
||||
equal('abcd' like 'abc*' ,true )
|
||||
equal('abcd' like '*bcd' ,true )
|
||||
equal('abcd' like 'abc?' ,true )
|
||||
equal('abcd' like '?bcd' ,true )
|
||||
equal('abcd' like 'ab?d' ,true )
|
||||
equal('abcd' like 'ab*d' ,true )
|
||||
equal('abcd' like 'a?cd' ,true )
|
||||
equal('abcd' like 'a*cd' ,true )
|
||||
equal('abcd' like 'a??d' ,true )
|
||||
equal('abcd' like 'a*?d' ,true )
|
||||
equal('abcd' like '*bc*' ,true )
|
||||
equal('abcd' like '?bc?' ,true )
|
||||
equal('abcd' like '????' ,true )
|
||||
equal('abcd' like 'a???' ,true )
|
||||
equal('abcd' like 'ab??' ,true )
|
||||
equal('abcd' like 'abc?' ,true )
|
||||
equal('abcd' like '???d' ,true )
|
||||
equal('abcd' like '??cd' ,true )
|
||||
equal('abcd' like '?bcd' ,true )
|
||||
equal('abcd' like '?b?d' ,true )
|
||||
equal('abcd' like 'a?c?' ,true )
|
||||
equal('abcd' like 'a??d' ,true )
|
||||
equal('abcd' like '?bc?' ,true )
|
||||
equal('abcd' like 'ab**' ,true )
|
||||
equal('abcd' like 'ab*?' ,true )
|
||||
equal('abcd' like 'a***' ,true )
|
||||
equal('abcd' like '**cd' ,true )
|
||||
equal('abcd' like '*?cd' ,true )
|
||||
equal('abcd' like '***d' ,true )
|
||||
equal('abcd' like '?*?d' ,true )
|
||||
equal('abcd' like '?*?d' ,true )
|
||||
equal('abcd' like '*bc*' ,true )
|
||||
equal('abcd' like '*bc?' ,true )
|
||||
equal('abcd' like '*b??' ,true )
|
||||
equal('abcd' like '?bc*' ,true )
|
||||
equal('abcd' like '??c*' ,true )
|
||||
equal('abcd' like '*b?*' ,true )
|
||||
equal('abcd' like '*b*d' ,true )
|
||||
equal('abcd' like 'a*c*' ,true )
|
||||
equal('abcd' like '?*cd' ,true )
|
||||
equal('abcd' like 'ab?*' ,true )
|
||||
equal('abcd' like 'ab*?' ,true )
|
||||
equal('abcd' like 'a?*d' ,true )
|
||||
equal('ab' like 'a*' ,true )
|
||||
equal('ab' like 'a?' ,true )
|
||||
equal('a' like 'a*' ,true )
|
||||
equal('xalabcd' like '*abcd*' ,true )
|
||||
equal('xablabcd' like '*abcd*' ,true )
|
||||
equal('xabclabcd' like '*abcd*' ,true )
|
||||
equal('aaaaa' like '*aa?' ,true )
|
||||
equal('abcd' ilike 'abcd*' ,true )
|
||||
equal('abcd' ilike 'abc*' ,true )
|
||||
equal('abcd' ilike 'ab*' ,true )
|
||||
equal('abcd' ilike 'a*' ,true )
|
||||
equal('abcd' ilike 'abc?' ,true )
|
||||
equal('a' ilike 'a*' ,true )
|
||||
equal('ab' ilike 'a*' ,true )
|
||||
equal('abcd' ilike 'abcd*' ,true )
|
||||
equal('' ilike '' ,true )
|
||||
equal('abcd' ilike 'abcd' ,true )
|
||||
equal('abcd' ilike 'abc*' ,true )
|
||||
equal('abcd' ilike '*bcd' ,true )
|
||||
equal('abcd' ilike 'abc?' ,true )
|
||||
equal('abcd' ilike '?bcd' ,true )
|
||||
equal('abcd' ilike 'ab?d' ,true )
|
||||
equal('abcd' ilike 'ab*d' ,true )
|
||||
equal('abcd' ilike 'a?cd' ,true )
|
||||
equal('abcd' ilike 'a*cd' ,true )
|
||||
equal('abcd' ilike 'a??d' ,true )
|
||||
equal('abcd' ilike 'a*?d' ,true )
|
||||
equal('abcd' ilike '*bc*' ,true )
|
||||
equal('abcd' ilike '?bc?' ,true )
|
||||
equal('abcd' ilike '????' ,true )
|
||||
equal('abcd' ilike 'a???' ,true )
|
||||
equal('abcd' ilike 'ab??' ,true )
|
||||
equal('abcd' ilike 'abc?' ,true )
|
||||
equal('abcd' ilike '???d' ,true )
|
||||
equal('abcd' ilike '??cd' ,true )
|
||||
equal('abcd' ilike '?bcd' ,true )
|
||||
equal('abcd' ilike '?b?d' ,true )
|
||||
equal('abcd' ilike 'a?c?' ,true )
|
||||
equal('abcd' ilike 'a??d' ,true )
|
||||
equal('abcd' ilike '?bc?' ,true )
|
||||
equal('abcd' ilike 'ab**' ,true )
|
||||
equal('abcd' ilike 'ab*?' ,true )
|
||||
equal('abcd' ilike 'a***' ,true )
|
||||
equal('abcd' ilike '**cd' ,true )
|
||||
equal('abcd' ilike '*?cd' ,true )
|
||||
equal('abcd' ilike '***d' ,true )
|
||||
equal('abcd' ilike '?*?d' ,true )
|
||||
equal('abcd' ilike '?*?d' ,true )
|
||||
equal('abcd' ilike '*bc*' ,true )
|
||||
equal('abcd' ilike '*bc?' ,true )
|
||||
equal('abcd' ilike '*b??' ,true )
|
||||
equal('abcd' ilike '?bc*' ,true )
|
||||
equal('abcd' ilike '??c*' ,true )
|
||||
equal('abcd' ilike '*b?*' ,true )
|
||||
equal('abcd' ilike '*b*d' ,true )
|
||||
equal('abcd' ilike 'a*c*' ,true )
|
||||
equal('abcd' ilike '?*cd' ,true )
|
||||
equal('abcd' ilike 'ab?*' ,true )
|
||||
equal('abcd' ilike 'ab*?' ,true )
|
||||
equal('abcd' ilike 'a?*d' ,true )
|
||||
equal('ab' ilike 'a*' ,true )
|
||||
equal('ab' ilike 'a?' ,true )
|
||||
equal('a' ilike 'a*' ,true )
|
||||
equal('xalabcd' ilike '*abcd*',true )
|
||||
equal('xablabcd' ilike '*abcd*',true )
|
||||
equal('xabclabcd' ilike '*abcd*',true )
|
||||
equal('aaaaa' ilike '*aa?' ,true )
|
||||
equal('abcd' like 'abcd?' ,false)
|
||||
equal('abcd' like 'abc??' ,false)
|
||||
equal('abcd' like 'ab???' ,false)
|
||||
equal('abcd' like 'a????' ,false)
|
||||
equal('abcd' like '?????' ,false)
|
||||
equal('a' like 'a?' ,false)
|
||||
equal('abcd' like 'xyzw' ,false)
|
||||
equal('abcd' like 'xyz' ,false)
|
||||
equal('abc' like 'xyzw' ,false)
|
||||
equal('abcd' like 'ab?' ,false)
|
||||
equal('abcd' like 'a?' ,false)
|
||||
equal('abcd' ilike 'abcd?' ,false)
|
||||
equal('abcd' ilike 'abc??' ,false)
|
||||
equal('abcd' ilike 'ab???' ,false)
|
||||
equal('abcd' ilike 'a????' ,false)
|
||||
equal('abcd' ilike '?????' ,false)
|
||||
equal('a' ilike 'a?' ,false)
|
||||
equal('abcd' ilike 'xyzw' ,false)
|
||||
equal('abcd' ilike 'xyz' ,false)
|
||||
equal('abc' ilike 'xyzw' ,false)
|
||||
equal('abcd' ilike 'ab?' ,false)
|
||||
equal('abcd' ilike 'a?' ,false)
|
||||
equal(true, ~{var s := ~{var n := 1; var m := 2; if (n < m) 'n < m'; else 'n >= m'; }; (s == 'n < m')})
|
||||
equal(true, ~{var s := ~{var n := 1; var m := 2; if (n > m) 'n <= m'; else 'n > m'; }; (s == 'n > m')})
|
||||
equal(true, ~{var s := ~{var n := 1; var m := 2; if (n < m) 'n < m'; else 'n >' + '= m'; }; (s == 'n < m')})
|
||||
equal(true, ~{var s := ~{var n := 1; var m := 2; if (n < m) 'n ' + '< m'; else 'n >= m'; }; (s == 'n < m')})
|
||||
equal(true, ~{var s := ~{var n := 1; var m := 2; if (n > m) 'n <= m'; else 'n ' + '> m'; }; (s == 'n > m')})
|
||||
equal(true, ~{var s := ~{var n := 1; var m := 2; if (n > m) 'n <' + '= m'; else 'n > m'; }; (s == 'n > m')})
|
||||
equal(true, ~{var s := ~{var n := 1; var m := 2; var r0 := 'n < m'; var r1 := 'n >= m'; if (n < m) r0; else r1; }; (s == 'n < m')})
|
||||
equal(true, ~{var s := ~{var n := 1; var m := 2; var r0 := 'n < m'; var r1 := 'n >= m'; if (n < m) r0 + ''; else r1 + ''; }; (s == 'n < m')})
|
||||
equal(true, ~{var s := ~{var n := 1; var m := 2; var r0 := 'n < m'; var r1 := 'n >= m'; if (n < m) '' + r0; else '' + r1; }; (s == 'n < m')})
|
||||
equal(111,~{var n:=1; switch { case n > 0: 111; default: 222; }})
|
||||
equal(222,~{var n:=0; switch { case n > 0: 111; default: 222; }})
|
||||
equal(111,~{var n:=0; switch { case true : 111; default: 222; }})
|
||||
equal(222,~{var n:=0; switch { case false: 111; default: 222; }})
|
||||
equal(111,~{var n:=1; switch { default: 222; case n > 0: 111; }})
|
||||
equal(222,~{var n:=0; switch { default: 222; case n > 0: 111; }})
|
||||
equal(111,~{var n:=0; switch { default: 222; case true : 111; }})
|
||||
equal(222,~{var n:=0; switch { default: 222; case false: 111; }})
|
||||
equal(111,~{var n:=1; switch { case n == 1: 111; case n == 2: 222; default: 333; }})
|
||||
equal(111,~{var n:=1; switch { case n == 1: 111; default: 333; case n == 2: 222; }})
|
||||
equal(111,~{var n:=1; switch { default: 333; case n == 1: 111; case n == 2: 222; }})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 < 2, v0, v1) == v0})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 > 2, v0, v1) == v1})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 < 2, v0 - v1, v1 - v0) == (v0 - v1)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 > 2, v0 - v1, v1 - v0) == (v1 - v0)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; if (x_ < y_, v0, v1) == v0})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; if (x_ > y_, v0, v1) == v1})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; if (x_ < y_, v0 - v1, v1 - v0) == (v0 - v1)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; if (x_ > y_, v0 - v1, v1 - v0) == (v1 - v0)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 < 2, v0, v1) == v0})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 > 2, v0, v1) == v1})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 < 2, v0 - v1, v1 - v0) == (v0 - v1)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 > 2, v0 - v1, v1 - v0) == (v1 - v0)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; if (x_ < y_, v0, v1) == v0})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; if (x_ > y_, v0, v1) == v1})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; if (x_ < y_, v0 - v1, v1 - v0) == (v0 - v1)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; if (x_ > y_, v0 - v1, v1 - v0) == (v1 - v0)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 < 2) v0; else v1;) == v0})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 > 2) v0; else v1;) == v1})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 < 2) v0 - v1; else v1 - v0;) == (v0 - v1)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 > 2) v0 - v1; else v1 - v0;) == (v1 - v0)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; (if (x_ < y_) v0; else v1;) == v0})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; (if (x_ > y_) v0; else v1;) == v1})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; (if (x_ < y_) v0 - v1; else v1 - v0;) == (v0 - v1)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; (if (x_ > y_) v0 - v1; else v1 - v0;) == (v1 - v0)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 < 2) v0; else v1;) == v0})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 > 2) v0; else v1;) == v1})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 < 2) v0 - v1; else v1 - v0;) == (v0 - v1)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 > 2) v0 - v1; else v1 - v0;) == (v1 - v0)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; (if (x_ < y_) v0; else v1;) == v0})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; (if (x_ > y_) v0; else v1;) == v1})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; (if (x_ < y_) v0 - v1; else v1 - v0;) == (v0 - v1)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; (if (x_ > y_) v0 - v1; else v1 - v0;) == (v1 - v0)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; ((1 < 2) ? v0 : v1) == v0})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; ((1 > 2) ? v0 : v1) == v1})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; ((1 < 2) ? v0 - v1 : v1 - v0) == (v0 - v1)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; ((1 > 2) ? v0 - v1 : v1 - v0) == (v1 - v0)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; ((x_ < y_) ? v0 : v1) == v0})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; ((x_ > y_) ? v0 : v1) == v1})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; ((x_ < y_) ? v0 - v1 : v1 - v0) == (v0 - v1)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; ((x_ > y_) ? v0 - v1 : v1 - v0) == (v1 - v0)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; ((1 < 2) ? v0 : v1) == v0})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; ((1 > 2) ? v0 : v1) == v1})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; ((1 < 2) ? v0 - v1 : v1 - v0) == (v0 - v1)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; ((1 > 2) ? v0 - v1 : v1 - v0) == (v1 - v0)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; ((x_ < y_) ? v0 : v1) == v0})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; ((x_ > y_) ? v0 : v1) == v1})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; ((x_ < y_) ? v0 - v1 : v1 - v0) == (v0 - v1)})
|
||||
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; ((x_ > y_) ? v0 - v1 : v1 - v0) == (v1 - v0)})
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 1 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -26,8 +26,8 @@ template <typename T>
|
|||
void trig_function()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string expression_string =
|
||||
"clamp(-1.0,sin(2 * pi * x) + cos(x / 2 * pi),+1.0)";
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 2 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -26,8 +26,8 @@ template <typename T>
|
|||
void square_wave()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string expr_string =
|
||||
"a*(4/pi)*"
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 3 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -26,8 +26,8 @@ template <typename T>
|
|||
void polynomial()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string expression_string =
|
||||
"25x^5 - 35x^4 - 15x^3 + 40x^2 - 15x + 1";
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 4 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -25,11 +25,11 @@
|
|||
template <typename T>
|
||||
void fibonacci()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::function_compositor<T> compositor_t;
|
||||
typedef typename compositor_t::function function_t;
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::function_compositor<T> compositor_t;
|
||||
typedef typename compositor_t::function function_t;
|
||||
|
||||
compositor_t compositor;
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 5 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -47,8 +47,8 @@ template <typename T>
|
|||
void custom_function()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string expression_string =
|
||||
"myfunc(sin(x / pi), otherfunc(3 * y, x / 2, x * y))";
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 6 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -26,8 +26,8 @@ template <typename T>
|
|||
void vector_function()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string expression_string =
|
||||
" for (var i := 0; i < min(x[],y[],z[]); i += 1) "
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 7 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -26,8 +26,8 @@ template <typename T>
|
|||
void logic()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string expression_string = "not(A and B) or C";
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 8 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -25,12 +25,12 @@
|
|||
template <typename T>
|
||||
void composite()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::parser_error::type err_t;
|
||||
typedef exprtk::function_compositor<T> compositor_t;
|
||||
typedef typename compositor_t::function function_t;
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::parser_error::type error_t;
|
||||
typedef exprtk::function_compositor<T> compositor_t;
|
||||
typedef typename compositor_t::function function_t;
|
||||
|
||||
compositor_t compositor;
|
||||
|
||||
|
@ -65,7 +65,7 @@ void composite()
|
|||
|
||||
for (std::size_t i = 0; i < parser.error_count(); ++i)
|
||||
{
|
||||
const err_t error = parser.get_error(i);
|
||||
const error_t error = parser.get_error(i);
|
||||
|
||||
printf("Error: %02d Position: %02d Type: [%14s] Msg: %s\tExpression: %s\n",
|
||||
static_cast<unsigned int>(i),
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 9 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -25,11 +25,11 @@
|
|||
template <typename T>
|
||||
void primes()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::function_compositor<T> compositor_t;
|
||||
typedef typename compositor_t::function function_t;
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::function_compositor<T> compositor_t;
|
||||
typedef typename compositor_t::function function_t;
|
||||
|
||||
T x = T(0);
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 10 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -26,11 +26,11 @@
|
|||
template <typename T>
|
||||
void newton_sqrt()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::function_compositor<T> compositor_t;
|
||||
typedef typename compositor_t::function function_t;
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::function_compositor<T> compositor_t;
|
||||
typedef typename compositor_t::function function_t;
|
||||
|
||||
T x = T(0);
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 11 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -26,8 +26,8 @@ template <typename T>
|
|||
void square_wave2()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string wave_program =
|
||||
" var r := 0; "
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 12 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -26,8 +26,8 @@ template <typename T>
|
|||
void bubble_sort()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string bubblesort_program =
|
||||
" var upper_bound := v[]; "
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 13 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -28,8 +28,8 @@ template <typename T>
|
|||
void savitzky_golay_filter()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string sgfilter_program =
|
||||
" var weight[9] := "
|
||||
|
@ -69,15 +69,15 @@ void savitzky_golay_filter()
|
|||
// Generate a signal with noise.
|
||||
for (T t = T(-5); t <= T(+5); t += T(10.0 / n))
|
||||
{
|
||||
T noise = T(0.5 * (rand() / (RAND_MAX + 1.0) - 0.5));
|
||||
const T noise = T(0.5 * (rand() / (RAND_MAX + 1.0) - 0.5));
|
||||
v_in.push_back(sin(2.0 * pi * t) + noise);
|
||||
}
|
||||
|
||||
v_out.resize(v_in.size());
|
||||
|
||||
symbol_table_t symbol_table;
|
||||
symbol_table.add_vector("v_in" , v_in);
|
||||
symbol_table.add_vector("v_out",v_out);
|
||||
symbol_table.add_vector("v_in" , v_in );
|
||||
symbol_table.add_vector("v_out", v_out);
|
||||
|
||||
expression_t expression;
|
||||
expression.register_symbol_table(symbol_table);
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 14 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -26,7 +26,7 @@ template <typename T>
|
|||
void stddev_example()
|
||||
{
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string stddev_program =
|
||||
" var x[25] := { "
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 15 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -26,8 +26,8 @@ template <typename T>
|
|||
void black_scholes_merton_model()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string bsm_model_program =
|
||||
" var d1 := (log(s / x) + (r + v^2 / 2) * t) / (v * sqrt(t)); "
|
||||
|
@ -67,7 +67,7 @@ void black_scholes_merton_model()
|
|||
{
|
||||
callput_flag = "call";
|
||||
|
||||
T bsm = expression.value();
|
||||
const T bsm = expression.value();
|
||||
|
||||
printf("BSM(%s,%5.3f,%5.3f,%5.3f,%5.3f,%5.3f) = %10.6f\n",
|
||||
callput_flag.c_str(),
|
||||
|
@ -78,7 +78,7 @@ void black_scholes_merton_model()
|
|||
{
|
||||
callput_flag = "put";
|
||||
|
||||
T bsm = expression.value();
|
||||
const T bsm = expression.value();
|
||||
|
||||
printf("BSM(%s,%5.3f,%5.3f,%5.3f,%5.3f,%5.3f) = %10.6f\n",
|
||||
callput_flag.c_str(),
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 16 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -27,8 +27,8 @@ template <typename T>
|
|||
void linear_least_squares()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string linear_least_squares_program =
|
||||
" if (x[] == y[]) "
|
||||
|
@ -55,11 +55,11 @@ void linear_least_squares()
|
|||
T rmse = T(0);
|
||||
|
||||
symbol_table_t symbol_table;
|
||||
symbol_table.add_variable("alpha",alpha);
|
||||
symbol_table.add_variable("beta" ,beta );
|
||||
symbol_table.add_variable("rmse" ,rmse );
|
||||
symbol_table.add_vector ("x" ,x );
|
||||
symbol_table.add_vector ("y" ,y );
|
||||
symbol_table.add_variable("alpha", alpha);
|
||||
symbol_table.add_variable("beta" , beta );
|
||||
symbol_table.add_variable("rmse" , rmse );
|
||||
symbol_table.add_vector ("x" , x );
|
||||
symbol_table.add_vector ("y" , y );
|
||||
|
||||
expression_t expression;
|
||||
expression.register_symbol_table(symbol_table);
|
||||
|
@ -69,10 +69,10 @@ void linear_least_squares()
|
|||
|
||||
expression.value();
|
||||
|
||||
printf("alpha: %15.12f\n",alpha);
|
||||
printf("beta: %15.12f\n",beta );
|
||||
printf("rmse: %15.12f\n",rmse );
|
||||
printf("y = %15.12fx + %15.12f\n",beta,alpha);
|
||||
printf("alpha: %15.12f\n", alpha);
|
||||
printf("beta: %15.12f\n", beta );
|
||||
printf("rmse: %15.12f\n", rmse );
|
||||
printf("y = %15.12fx + %15.12f\n", beta, alpha);
|
||||
}
|
||||
|
||||
int main()
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 17 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -44,8 +44,8 @@ template <typename T>
|
|||
void monte_carlo_pi()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string monte_carlo_pi_program =
|
||||
" var experiments[5 * 10^7] := [(rnd_01^2 + rnd_01^2) <= 1]; "
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 18 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -26,8 +26,8 @@ template <typename T>
|
|||
void file_io()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string fileio_program =
|
||||
" var file_name := 'file.txt'; "
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Simple Example 19 *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -81,8 +81,8 @@ template <typename T>
|
|||
void vector_randu()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
const std::string vecrandu_program =
|
||||
" var noise[6] := [0]; "
|
||||
|
@ -109,9 +109,9 @@ void vector_randu()
|
|||
randu<T> randu;
|
||||
|
||||
symbol_table_t symbol_table;
|
||||
symbol_table.add_vector ("signal" , signal);
|
||||
symbol_table.add_function("println",println);
|
||||
symbol_table.add_function("randu" , randu);
|
||||
symbol_table.add_vector ("signal" , signal );
|
||||
symbol_table.add_function("println", println);
|
||||
symbol_table.add_function("randu" , randu );
|
||||
|
||||
expression_t expression;
|
||||
expression.register_symbol_table(symbol_table);
|
||||
|
|
601
exprtk_test.cpp
601
exprtk_test.cpp
|
@ -3,7 +3,7 @@
|
|||
* C++ Mathematical Expression Toolkit Library *
|
||||
* *
|
||||
* Examples and Unit-Tests *
|
||||
* Author: Arash Partow (1999-2020) *
|
||||
* Author: Arash Partow (1999-2021) *
|
||||
* URL: http://www.partow.net/programming/exprtk/index.html *
|
||||
* *
|
||||
* Copyright notice: *
|
||||
|
@ -358,6 +358,42 @@ static const test_t global_test_list[] =
|
|||
test_t("( 7 - 2 )",+5.0),
|
||||
test_t("( 8 - 1 )",+7.0),
|
||||
test_t("( 9 - 0 )",+9.0),
|
||||
test_t("1 - -1" , 2.0),
|
||||
test_t("1 --1" , 2.0),
|
||||
test_t("1-- 1" , 2.0),
|
||||
test_t("1--1" , 2.0),
|
||||
test_t("1 -- -1", 0.0),
|
||||
test_t("1 + -1" , 0.0),
|
||||
test_t("1 +-1" , 0.0),
|
||||
test_t("1+- 1" , 0.0),
|
||||
test_t("1+-1" , 0.0),
|
||||
test_t("1 +- -1", 2.0),
|
||||
test_t("1 + +1" , 2.0),
|
||||
test_t("1 ++1" , 2.0),
|
||||
test_t("1 - -1 + 1" , 3.0),
|
||||
test_t("1 --1 + 1" , 3.0),
|
||||
test_t("1-- 1 + 1" , 3.0),
|
||||
test_t("1--1 + 1" , 3.0),
|
||||
test_t("1 -- -1 + 1", 1.0),
|
||||
test_t("1 + -1 + 1" , 1.0),
|
||||
test_t("1 +-1 + 1" , 1.0),
|
||||
test_t("1+- 1 + 1" , 1.0),
|
||||
test_t("1+-1 + 1" , 1.0),
|
||||
test_t("1 +- -1 + 1", 3.0),
|
||||
test_t("1 + +1 + 1" , 3.0),
|
||||
test_t("1 ++1 + 1" , 3.0),
|
||||
test_t("1 - -1 - 1" , 1.0),
|
||||
test_t("1 --1 - 1" , 1.0),
|
||||
test_t("1-- 1 - 1" , 1.0),
|
||||
test_t("1--1 - 1" , 1.0),
|
||||
test_t("1 -- -1 - 1", -1.0),
|
||||
test_t("1 + -1 - 1" , -1.0),
|
||||
test_t("1 +-1 - 1" , -1.0),
|
||||
test_t("1+- 1 - 1" , -1.0),
|
||||
test_t("1+-1 - 1" , -1.0),
|
||||
test_t("1 +- -1 - 1", 1.0),
|
||||
test_t("1 + +1 - 1" , 1.0),
|
||||
test_t("1 ++1 - 1" , 1.0),
|
||||
test_t("-(1+2)",-3.0),
|
||||
test_t("+(1+2)",+3.0),
|
||||
test_t("+(1-2)",-1.0),
|
||||
|
@ -1162,14 +1198,14 @@ inline bool test_expression(const std::string& expression_string, const T& expec
|
|||
return false;
|
||||
}
|
||||
|
||||
T result = expression.value();
|
||||
const T result = expression.value();
|
||||
|
||||
if (not_equal(result,expected_result))
|
||||
{
|
||||
printf("test_expression() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
|
||||
expression_string.c_str(),
|
||||
(double)expected_result,
|
||||
(double)result);
|
||||
static_cast<double>(expected_result),
|
||||
static_cast<double>(result));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -1177,6 +1213,43 @@ inline bool test_expression(const std::string& expression_string, const T& expec
|
|||
return true;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
struct edge_cases {};
|
||||
|
||||
template <>
|
||||
struct edge_cases<float>
|
||||
{
|
||||
static inline std::vector<test_t> test_cases()
|
||||
{
|
||||
std::vector<test_t> cases;
|
||||
cases.push_back(test_t(" 1.175494350822287508e-38", 1.175494350822287508e-38));
|
||||
cases.push_back(test_t(" 3.402823466385288598e+38", 3.402823466385288598e+38));
|
||||
cases.push_back(test_t("+1.175494350822287508e-38", +1.175494350822287508e-38));
|
||||
cases.push_back(test_t("+3.402823466385288598e+38", +3.402823466385288598e+38));
|
||||
cases.push_back(test_t("-1.175494350822287508e-38", -1.175494350822287508e-38));
|
||||
cases.push_back(test_t("-3.402823466385288598e+38", -3.402823466385288598e+38));
|
||||
|
||||
return cases;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct edge_cases<double>
|
||||
{
|
||||
static inline std::vector<test_t> test_cases()
|
||||
{
|
||||
std::vector<test_t> cases;
|
||||
cases.push_back(test_t(" 2.2250738585072013831e-308", 2.2250738585072013831e-308));
|
||||
cases.push_back(test_t(" 1.7976931348623157081e+308", 1.7976931348623157081e+308));
|
||||
cases.push_back(test_t("+2.2250738585072013831e-308", +2.2250738585072013831e-308));
|
||||
cases.push_back(test_t("+1.7976931348623157081e+308", +1.7976931348623157081e+308));
|
||||
cases.push_back(test_t("-2.2250738585072013831e-308", -2.2250738585072013831e-308));
|
||||
cases.push_back(test_t("-1.7976931348623157081e+308", -1.7976931348623157081e+308));
|
||||
|
||||
return cases;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
inline bool run_test00()
|
||||
{
|
||||
|
@ -1198,6 +1271,25 @@ inline bool run_test00()
|
|||
}
|
||||
}
|
||||
|
||||
{
|
||||
const std::vector<test_t> tests = edge_cases<T>::test_cases();
|
||||
|
||||
bool result = true;
|
||||
|
||||
for (std::size_t i = 0; i < tests.size(); ++i)
|
||||
{
|
||||
if (!test_expression<T>(tests[i].first,T(tests[i].second)))
|
||||
{
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!result)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1256,34 +1348,106 @@ inline bool run_test01()
|
|||
test_xy<T>("2 * (x + y) - 1" ,T(2.2),T(3.3),T(10.0 )),
|
||||
test_xy<T>("y + (x + 1)" ,T(2.2),T(3.3),T(6.5 )),
|
||||
test_xy<T>("(x + 1) + y" ,T(2.2),T(3.3),T(6.5 )),
|
||||
test_xy<T>("2 * x" ,T(2.2),T(0.0),T(4.4)),
|
||||
test_xy<T>("x * 2" ,T(2.2),T(0.0),T(4.4)),
|
||||
test_xy<T>("1.1 + x",T(2.2),T(0.0),T(3.3)),
|
||||
test_xy<T>("x + 1.1",T(2.2),T(0.0),T(3.3)),
|
||||
test_xy<T>("x * 1 == x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("1 * x == x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("y * 1 == y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("1 * y == y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("0 * x == 0" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("y * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("0 * y == 0" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x + 1 == 1 + x",T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("y + 1 == 1 + y",T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x + y == y + x",T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x * y == y * x",T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x < y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("y > x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x <= y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("y >= x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x + y > y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x + y > x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x * y > y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x * y > x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("(x + y) > y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("(x + y) > x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("(x * y) > y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("(x * y) > x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("2 * x" ,T(2.2),T(0.0),T(4.4)),
|
||||
test_xy<T>("x * 2" ,T(2.2),T(0.0),T(4.4)),
|
||||
test_xy<T>("1.1 + x" ,T(2.2),T(0.0),T(3.3)),
|
||||
test_xy<T>("x + 1.1" ,T(2.2),T(0.0),T(3.3)),
|
||||
test_xy<T>("x - -1 " ,T(1.0),T(0.0),T(2)),
|
||||
test_xy<T>("x --1 " ,T(1.0),T(0.0),T(2)),
|
||||
test_xy<T>("x-- 1 " ,T(1.0),T(0.0),T(2)),
|
||||
test_xy<T>("x--1 " ,T(1.0),T(0.0),T(2)),
|
||||
test_xy<T>("x -- -1" ,T(1.0),T(0.0),T(0)),
|
||||
test_xy<T>("x + -1 " ,T(1.0),T(0.0),T(0)),
|
||||
test_xy<T>("x +-1 " ,T(1.0),T(0.0),T(0)),
|
||||
test_xy<T>("x+- 1 " ,T(1.0),T(0.0),T(0)),
|
||||
test_xy<T>("x+-1 " ,T(1.0),T(0.0),T(0)),
|
||||
test_xy<T>("x +- -1" ,T(1.0),T(0.0),T(2)),
|
||||
test_xy<T>("x + +1 " ,T(1.0),T(0.0),T(2)),
|
||||
test_xy<T>("x ++1 " ,T(1.0),T(0.0),T(2)),
|
||||
test_xy<T>("1 - -x " ,T(1.0),T(0.0),T(2)),
|
||||
test_xy<T>("1 --x " ,T(1.0),T(0.0),T(2)),
|
||||
test_xy<T>("1-- x " ,T(1.0),T(0.0),T(2)),
|
||||
test_xy<T>("1--x " ,T(1.0),T(0.0),T(2)),
|
||||
test_xy<T>("1 -- -x" ,T(1.0),T(0.0),T(0)),
|
||||
test_xy<T>("1 + -x " ,T(1.0),T(0.0),T(0)),
|
||||
test_xy<T>("1 +-x " ,T(1.0),T(0.0),T(0)),
|
||||
test_xy<T>("1+- x " ,T(1.0),T(0.0),T(0)),
|
||||
test_xy<T>("1+-x " ,T(1.0),T(0.0),T(0)),
|
||||
test_xy<T>("1 +- -x" ,T(1.0),T(0.0),T(2)),
|
||||
test_xy<T>("1 + +x " ,T(1.0),T(0.0),T(2)),
|
||||
test_xy<T>("1 ++x " ,T(1.0),T(0.0),T(2)),
|
||||
test_xy<T>("(x - -1 + 1)" ,T(1.0),T(0.0),T(3)),
|
||||
test_xy<T>("(x --1 + 1)" ,T(1.0),T(0.0),T(3)),
|
||||
test_xy<T>("(x-- 1 + 1)" ,T(1.0),T(0.0),T(3)),
|
||||
test_xy<T>("(x--1 + 1)" ,T(1.0),T(0.0),T(3)),
|
||||
test_xy<T>("(x -- -1 + 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(x + -1 + 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(x +-1 + 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(x+- 1 + 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(x+-1 + 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(x +- -1 + 1)" ,T(1.0),T(0.0),T(3)),
|
||||
test_xy<T>("(x + +1 + 1)" ,T(1.0),T(0.0),T(3)),
|
||||
test_xy<T>("(x ++1 + 1)" ,T(1.0),T(0.0),T(3)),
|
||||
test_xy<T>("(1 - -x + 1)" ,T(1.0),T(0.0),T(3)),
|
||||
test_xy<T>("(1 --x + 1)" ,T(1.0),T(0.0),T(3)),
|
||||
test_xy<T>("(1-- x + 1)" ,T(1.0),T(0.0),T(3)),
|
||||
test_xy<T>("(1--x + 1)" ,T(1.0),T(0.0),T(3)),
|
||||
test_xy<T>("(1 -- -x + 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(1 + -x + 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(1 +-x + 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(1+- x + 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(1+-x + 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(1 +- -x + 1)" ,T(1.0),T(0.0),T(3)),
|
||||
test_xy<T>("(1 + +x + 1)" ,T(1.0),T(0.0),T(3)),
|
||||
test_xy<T>("(1 ++x + 1)" ,T(1.0),T(0.0),T(3)),
|
||||
test_xy<T>("(x - -1 - 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(x --1 - 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(x-- 1 - 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(x--1 - 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(x -- -1 - 1)" ,T(1.0),T(0.0),T(-1)),
|
||||
test_xy<T>("(x + -1 - 1)" ,T(1.0),T(0.0),T(-1)),
|
||||
test_xy<T>("(x +-1 - 1)" ,T(1.0),T(0.0),T(-1)),
|
||||
test_xy<T>("(x+- 1 - 1)" ,T(1.0),T(0.0),T(-1)),
|
||||
test_xy<T>("(x+-1 - 1)" ,T(1.0),T(0.0),T(-1)),
|
||||
test_xy<T>("(x +- -1 - 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(x + +1 - 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(x ++1 - 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(1 - -x - 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(1 --x - 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(1-- x - 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(1--x - 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(1 -- -x - 1)" ,T(1.0),T(0.0),T(-1)),
|
||||
test_xy<T>("(1 + -x - 1)" ,T(1.0),T(0.0),T(-1)),
|
||||
test_xy<T>("(1 +-x - 1)" ,T(1.0),T(0.0),T(-1)),
|
||||
test_xy<T>("(1+- x - 1)" ,T(1.0),T(0.0),T(-1)),
|
||||
test_xy<T>("(1+-x - 1)" ,T(1.0),T(0.0),T(-1)),
|
||||
test_xy<T>("(1 +- -x - 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(1 + +x - 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("(1 ++x - 1)" ,T(1.0),T(0.0),T(1)),
|
||||
test_xy<T>("x * 1 == x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("1 * x == x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("y * 1 == y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("1 * y == y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("0 * x == 0" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("y * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("0 * y == 0" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x + 1 == 1 + x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("y + 1 == 1 + y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x + y == y + x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x * y == y * x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x < y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("y > x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x <= y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("y >= x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x + y > y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x + y > x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x * y > y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("x * y > x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("(x + y) > y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("(x + y) > x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("(x * y) > y" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("(x * y) > x" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("(2x + 3y) == (2*x + 3*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>("2(x + y) == (2*x + 2*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||
test_xy<T>(" (x + y)3 == (3*x + 3*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||
|
@ -1646,14 +1810,14 @@ inline bool run_test01()
|
|||
}
|
||||
}
|
||||
|
||||
T result = expression.value();
|
||||
const T result = expression.value();
|
||||
|
||||
if (not_equal(result,test.result))
|
||||
{
|
||||
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
|
||||
test.expr.c_str(),
|
||||
(double)test.result,
|
||||
(double)result);
|
||||
static_cast<double>(test.result),
|
||||
static_cast<double>(result));
|
||||
|
||||
loop_result = false;
|
||||
}
|
||||
|
@ -1758,14 +1922,14 @@ inline bool run_test01()
|
|||
}
|
||||
}
|
||||
|
||||
T result = expression.value();
|
||||
const T result = expression.value();
|
||||
|
||||
if (not_equal(result,test.result))
|
||||
{
|
||||
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
|
||||
test.expr.c_str(),
|
||||
(double)test.result,
|
||||
(double)result);
|
||||
static_cast<double>(test.result),
|
||||
static_cast<double>(result));
|
||||
|
||||
loop_result = false;
|
||||
}
|
||||
|
@ -1841,14 +2005,14 @@ inline bool run_test01()
|
|||
}
|
||||
}
|
||||
|
||||
T result = expression.value();
|
||||
const T result = expression.value();
|
||||
|
||||
if (not_equal(result,T(1)))
|
||||
{
|
||||
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
|
||||
expr_list[i].c_str(),
|
||||
(double)1.0,
|
||||
(double)result);
|
||||
static_cast<double>(1.0),
|
||||
static_cast<double>(result));
|
||||
|
||||
loop_result = false;
|
||||
}
|
||||
|
@ -1901,14 +2065,14 @@ inline bool run_test01()
|
|||
}
|
||||
}
|
||||
|
||||
T result = expression.value();
|
||||
const T result = expression.value();
|
||||
|
||||
if (not_equal(result,T(1)))
|
||||
{
|
||||
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
|
||||
expr_list[i].c_str(),
|
||||
(double)1.0,
|
||||
(double)result);
|
||||
static_cast<double>(1.0),
|
||||
static_cast<double>(result));
|
||||
loop_result = false;
|
||||
}
|
||||
}
|
||||
|
@ -2422,6 +2586,17 @@ inline bool run_test02()
|
|||
test_ab<T>("var i := 0; a[0:i+3] <=> b[:]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)),
|
||||
test_ab<T>("var i := 0; a[0:i+4] <=> b[:]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)),
|
||||
|
||||
test_ab<T>("var y:= 2; '01234567890'[y:] == a ", "234567890","" ,T(1.0)),
|
||||
test_ab<T>("var y:= 2; '01234567890'[y:][y:] == a ", "4567890" ,"" ,T(1.0)),
|
||||
test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:] == a ", "67890" ,"" ,T(1.0)),
|
||||
test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:][y:] == a ", "890" ,"" ,T(1.0)),
|
||||
test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:][y:][y:] == a", "0" ,"" ,T(1.0)),
|
||||
test_ab<T>("var y:= 2; '0123456789'[y:] == a ", "23456789" ,"" ,T(1.0)),
|
||||
test_ab<T>("var y:= 2; '0123456789'[y:][y:] == a ", "456789" ,"" ,T(1.0)),
|
||||
test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:] == a ", "6789" ,"" ,T(1.0)),
|
||||
test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:][y:] == a ", "89" ,"" ,T(1.0)),
|
||||
test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:][y:][y:] == a ", "" ,"" ,T(1.0)),
|
||||
|
||||
test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:0] := y[:]; x == '0XXXX'", "","",T(1.0)),
|
||||
test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[:]; x == '01XXX'", "","",T(1.0)),
|
||||
test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[:]; x == '012XX'", "","",T(1.0)),
|
||||
|
@ -2598,8 +2773,8 @@ inline bool run_test02()
|
|||
printf("run_test02() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\t"
|
||||
"a='%s'\tb='%s'\tc='%s'\n",
|
||||
test.expr.c_str(),
|
||||
(double)test.result,
|
||||
(double)expr_result,
|
||||
static_cast<double>(test.result),
|
||||
static_cast<double>(expr_result),
|
||||
str_a.c_str(),
|
||||
str_b.c_str(),
|
||||
str_c.c_str());
|
||||
|
@ -2676,8 +2851,8 @@ template <typename T>
|
|||
inline bool run_test03()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
std::string expression_string = "A+A0+aA+Aa0+b+B1+Bb+bB1+A+A0+AA+AA0+B+B1+BB+BB1+a+a0+aa+aa0+b+b1+bb+bb1+"
|
||||
"c+C2+Cc+Cc2+D+D3+dD+dD3+C+C2+CC+CC2+D+D3+DD+DD3+c+c2+cc+cc2+d+d3+dd+dd3+"
|
||||
|
@ -3013,10 +3188,10 @@ inline bool run_test04()
|
|||
{
|
||||
printf("run_test04() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\n",
|
||||
expression_string.c_str(),
|
||||
(double)result1,
|
||||
(double)result2,
|
||||
(double)x,
|
||||
(double)y);
|
||||
static_cast<double>(result1),
|
||||
static_cast<double>(result2),
|
||||
static_cast<double>(x),
|
||||
static_cast<double>(y));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -3083,10 +3258,10 @@ inline bool run_test05()
|
|||
{
|
||||
printf("run_test05() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\tIndex:%d\n",
|
||||
expression_string.c_str(),
|
||||
(double)real_result,
|
||||
(double)result,
|
||||
(double)x,
|
||||
(double)y,
|
||||
static_cast<double>(real_result),
|
||||
static_cast<double>(result),
|
||||
static_cast<double>(x),
|
||||
static_cast<double>(y),
|
||||
static_cast<unsigned int>(i));
|
||||
|
||||
return false;
|
||||
|
@ -3140,8 +3315,8 @@ inline bool run_test06()
|
|||
if (not_equal(total_area1,T(pi) / T(2),T(0.000001)))
|
||||
{
|
||||
printf("run_test06() - Integration Error: Expected: %19.15f\tResult: %19.15f\n",
|
||||
(double)(pi / T(2)),
|
||||
(double)total_area1);
|
||||
static_cast<double>(pi / T(2)),
|
||||
static_cast<double>(total_area1));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -3192,9 +3367,9 @@ inline bool run_test07()
|
|||
if (not_equal(deriv1_result1,deriv1_real_result,T(0.00001)))
|
||||
{
|
||||
printf("run_test07() - 1st Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
|
||||
(double)x,
|
||||
(double)deriv1_real_result,
|
||||
(double)deriv1_result1);
|
||||
static_cast<double>(x),
|
||||
static_cast<double>(deriv1_real_result),
|
||||
static_cast<double>(deriv1_result1));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -3214,9 +3389,9 @@ inline bool run_test07()
|
|||
if (not_equal(deriv2_result1,deriv2_real_result,T(0.01)))
|
||||
{
|
||||
printf("run_test07() - 2nd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
|
||||
(double)x,
|
||||
(double)deriv2_real_result,
|
||||
(double)deriv2_result1);
|
||||
static_cast<double>(x),
|
||||
static_cast<double>(deriv2_real_result),
|
||||
static_cast<double>(deriv2_result1));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -3236,9 +3411,9 @@ inline bool run_test07()
|
|||
if (not_equal(deriv3_result1,deriv3_real_result,T(0.01)))
|
||||
{
|
||||
printf("run_test07() - 3rd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
|
||||
(double)x,
|
||||
(double)deriv3_real_result,
|
||||
(double)deriv3_result1);
|
||||
static_cast<double>(x),
|
||||
static_cast<double>(deriv3_real_result),
|
||||
static_cast<double>(deriv3_result1));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -3526,9 +3701,9 @@ inline bool run_test09()
|
|||
|
||||
const T pi = T(3.141592653589793238462643383279502);
|
||||
|
||||
T result = expression.value();
|
||||
const T result = expression.value();
|
||||
|
||||
T expected = T(4) *
|
||||
const T expected = T(4) *
|
||||
(
|
||||
mf(sin(x*pi),y / T(2)) +
|
||||
mf(sin(x*pi),y / T(2)) +
|
||||
|
@ -3545,8 +3720,8 @@ inline bool run_test09()
|
|||
if (not_equal(result,expected,T(0.0000001)))
|
||||
{
|
||||
printf("run_test09() - Error Expected: %19.15f\tResult: %19.15f\n",
|
||||
(double)expected,
|
||||
(double)result);
|
||||
static_cast<double>(expected),
|
||||
static_cast<double>(result));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -4311,6 +4486,78 @@ inline bool run_test10()
|
|||
{
|
||||
"var x; 1",
|
||||
"var x := 1; x",
|
||||
"var x:= 1; x - -1 == 2",
|
||||
"var x:= 1; x --1 == 2",
|
||||
"var x:= 1; x-- 1 == 2",
|
||||
"var x:= 1; x--1 == 2",
|
||||
"var x:= 1; x -- -1== 0",
|
||||
"var x:= 1; x + -1 == 0",
|
||||
"var x:= 1; x +-1 == 0",
|
||||
"var x:= 1; x+- 1 == 0",
|
||||
"var x:= 1; x+-1 == 0",
|
||||
"var x:= 1; x +- -1== 2",
|
||||
"var x:= 1; x + +1 == 2",
|
||||
"var x:= 1; x ++1 == 2",
|
||||
"var x:= 1; 1 - -x == 2",
|
||||
"var x:= 1; 1 --x == 2",
|
||||
"var x:= 1; 1-- x == 2",
|
||||
"var x:= 1; 1--x == 2",
|
||||
"var x:= 1; 1 -- -x== 0",
|
||||
"var x:= 1; 1 + -x == 0",
|
||||
"var x:= 1; 1 +-x == 0",
|
||||
"var x:= 1; 1+- x == 0",
|
||||
"var x:= 1; 1+-x == 0",
|
||||
"var x:= 1; 1 +- -x== 2",
|
||||
"var x:= 1; 1 + +x == 2",
|
||||
"var x:= 1; 1 ++x == 2",
|
||||
"var x:= 1; (x - -1 + 1) == 3",
|
||||
"var x:= 1; (x --1 + 1) == 3",
|
||||
"var x:= 1; (x-- 1 + 1) == 3",
|
||||
"var x:= 1; (x--1 + 1) == 3",
|
||||
"var x:= 1; (x -- -1 + 1) == 1",
|
||||
"var x:= 1; (x + -1 + 1) == 1",
|
||||
"var x:= 1; (x +-1 + 1) == 1",
|
||||
"var x:= 1; (x+- 1 + 1) == 1",
|
||||
"var x:= 1; (x+-1 + 1) == 1",
|
||||
"var x:= 1; (x +- -1 + 1) == 3",
|
||||
"var x:= 1; (x + +1 + 1) == 3",
|
||||
"var x:= 1; (x ++1 + 1) == 3",
|
||||
"var x:= 1; (1 - -x + 1) == 3",
|
||||
"var x:= 1; (1 --x + 1) == 3",
|
||||
"var x:= 1; (1-- x + 1) == 3",
|
||||
"var x:= 1; (1--x + 1) == 3",
|
||||
"var x:= 1; (1 -- -x + 1) == 1",
|
||||
"var x:= 1; (1 + -x + 1) == 1",
|
||||
"var x:= 1; (1 +-x + 1) == 1",
|
||||
"var x:= 1; (1+- x + 1) == 1",
|
||||
"var x:= 1; (1+-x + 1) == 1",
|
||||
"var x:= 1; (1 +- -x + 1) == 3",
|
||||
"var x:= 1; (1 + +x + 1) == 3",
|
||||
"var x:= 1; (1 ++x + 1) == 3",
|
||||
"var x:= 1; (x - -1 - 1) == 1",
|
||||
"var x:= 1; (x --1 - 1) == 1",
|
||||
"var x:= 1; (x-- 1 - 1) == 1",
|
||||
"var x:= 1; (x--1 - 1) == 1",
|
||||
"var x:= 1; (x -- -1 - 1) == -1",
|
||||
"var x:= 1; (x + -1 - 1) == -1",
|
||||
"var x:= 1; (x +-1 - 1) == -1",
|
||||
"var x:= 1; (x+- 1 - 1) == -1",
|
||||
"var x:= 1; (x+-1 - 1) == -1",
|
||||
"var x:= 1; (x +- -1 - 1) == 1",
|
||||
"var x:= 1; (x + +1 - 1) == 1",
|
||||
"var x:= 1; (x ++1 - 1) == 1",
|
||||
"var x:= 1; (1 - -x - 1) == 1",
|
||||
"var x:= 1; (1 --x - 1) == 1",
|
||||
"var x:= 1; (1-- x - 1) == 1",
|
||||
"var x:= 1; (1--x - 1) == 1",
|
||||
"var x:= 1; (1 -- -x - 1) == -1",
|
||||
"var x:= 1; (1 + -x - 1) == -1",
|
||||
"var x:= 1; (1 +-x - 1) == -1",
|
||||
"var x:= 1; (1+- x - 1) == -1",
|
||||
"var x:= 1; (1+-x - 1) == -1",
|
||||
"var x:= 1; (1 +- -x - 1) == 1",
|
||||
"var x:= 1; (1 + +x - 1) == 1",
|
||||
"var x:= 1; (1 ++x - 1) == 1",
|
||||
"var x := 1; var y := 2; 1",
|
||||
"var x := 1; var y := 2; x",
|
||||
"var x:=6; var y:=4; x + -3 == 3",
|
||||
|
@ -4623,7 +4870,43 @@ inline bool run_test10()
|
|||
"var s := 'abc'; ~{1 + 2; 'abc' + s; s} == s ",
|
||||
"var s := 'abc'; ~{1 + 2; var x := 'ab'; x + 'c'} == s ",
|
||||
|
||||
"var x[10^6] := null; var y[10^7] := null; 0 * (min(x) + min(y)) + x[] + y[] == 10^7 + 10^6"
|
||||
"var x[10^6] := null; var y[10^7] := null; 0 * (min(x) + min(y)) + x[] + y[] == 10^7 + 10^6",
|
||||
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 < 2, v0, v1) == v0",
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 > 2, v0, v1) == v1",
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 < 2, v0 - v1, v1 - v0) == (v0 - v1)",
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 > 2, v0 - v1, v1 - v0) == (v1 - v0)",
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x < y, v0, v1) == v0",
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x > y, v0, v1) == v1",
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x < y, v0 - v1, v1 - v0) == (v0 - v1)",
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x > y, v0 - v1, v1 - v0) == (v1 - v0)",
|
||||
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 < 2, v0, v1) == v0",
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 > 2, v0, v1) == v1",
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 < 2, v0 - v1, v1 - v0) == (v0 - v1)",
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 > 2, v0 - v1, v1 - v0) == (v1 - v0)",
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x < y, v0, v1) == v0",
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x > y, v0, v1) == v1",
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x < y, v0 - v1, v1 - v0) == (v0 - v1)",
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x > y, v0 - v1, v1 - v0) == (v1 - v0)",
|
||||
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 < 2) v0; else v1;) == v0",
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 > 2) v0; else v1;) == v1",
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 < 2) v0 - v1; else v1 - v0;) == (v0 - v1)",
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 > 2) v0 - v1; else v1 - v0;) == (v1 - v0)",
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x < y) v0; else v1;) == v0",
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x > y) v0; else v1;) == v1",
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x < y) v0 - v1; else v1 - v0;) == (v0 - v1)",
|
||||
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x > y) v0 - v1; else v1 - v0;) == (v1 - v0)",
|
||||
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 < 2) v0; else v1;) == v0",
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 > 2) v0; else v1;) == v1",
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 < 2) v0 - v1; else v1 - v0;) == (v0 - v1)",
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 > 2) v0 - v1; else v1 - v0;) == (v1 - v0)",
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x < y) v0; else v1;) == v0",
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x > y) v0; else v1;) == v1",
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x < y) v0 - v1; else v1 - v0;) == (v0 - v1)",
|
||||
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x > y) v0 - v1; else v1 - v0;) == (v1 - v0)",
|
||||
};
|
||||
|
||||
const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
|
||||
|
@ -4662,7 +4945,7 @@ inline bool run_test10()
|
|||
}
|
||||
}
|
||||
|
||||
T result = expression.value();
|
||||
const T result = expression.value();
|
||||
|
||||
if (T(1) != result)
|
||||
{
|
||||
|
@ -4699,7 +4982,7 @@ inline bool run_test10()
|
|||
continue;
|
||||
}
|
||||
|
||||
T result = expression.value();
|
||||
const T result = expression.value();
|
||||
|
||||
if (T(1) != result)
|
||||
{
|
||||
|
@ -4927,8 +5210,8 @@ template <typename T>
|
|||
inline bool run_test13()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
static const std::string expression_string[] =
|
||||
{
|
||||
|
@ -5287,8 +5570,8 @@ inline bool run_test15()
|
|||
if (not_equal(base_result,result))
|
||||
{
|
||||
printf("run_test15() - Error in evaluation! (1) Base: %20.10f\tResult: %20.10f\tExpression: %s\n",
|
||||
(double)base_result,
|
||||
(double)result,
|
||||
static_cast<double>(base_result),
|
||||
static_cast<double>(result),
|
||||
expr_str_list[i].c_str());
|
||||
|
||||
failure = true;
|
||||
|
@ -5917,6 +6200,96 @@ struct overload_func : exprtk::igeneric_function<T>
|
|||
template <typename T>
|
||||
inline bool run_test18()
|
||||
{
|
||||
{
|
||||
exprtk::symbol_table<T> symbol_table;
|
||||
symbol_table.remove_variable("x",true);
|
||||
symbol_table.remove_variable("x",false);
|
||||
symbol_table.remove_stringvar("x");
|
||||
symbol_table.remove_function("x");
|
||||
symbol_table.remove_vararg_function("x");
|
||||
symbol_table.remove_vector("x");
|
||||
}
|
||||
|
||||
{
|
||||
exprtk::symbol_table<T> symbol_table;
|
||||
|
||||
{
|
||||
T x;
|
||||
const bool result1 = symbol_table.add_variable("x", x);
|
||||
const bool result2 = symbol_table.remove_variable("x");
|
||||
const bool result3 = symbol_table.remove_variable("x");
|
||||
|
||||
if (!result1 || !result2 || result3)
|
||||
{
|
||||
printf("run_test18() - Failed sym_tab add/remove [1]\n");
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
std::string x;
|
||||
const bool result1 = symbol_table.add_stringvar("x", x);
|
||||
const bool result2 = symbol_table.remove_stringvar("x");
|
||||
const bool result3 = symbol_table.remove_stringvar("x");
|
||||
|
||||
if (!result1 || !result2 || result3)
|
||||
{
|
||||
printf("run_test18() - Failed sym_tab add/remove [2]\n");
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
std::vector<T> x(10,T(0));
|
||||
const bool result1 = symbol_table.add_vector("x", x);
|
||||
const bool result2 = symbol_table.remove_vector("x");
|
||||
const bool result3 = symbol_table.remove_vector("x");
|
||||
|
||||
if (!result1 || !result2 || result3)
|
||||
{
|
||||
printf("run_test18() - Failed sym_tab add/remove [3]\n");
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
myfunc<T> x;
|
||||
const bool result1 = symbol_table.add_function("x", x);
|
||||
const bool result2 = symbol_table.remove_function("x");
|
||||
const bool result3 = symbol_table.remove_function("x");
|
||||
|
||||
if (!result1 || !result2 || result3)
|
||||
{
|
||||
printf("run_test18() - Failed sym_tab add/remove [4]\n");
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
va_func<T> x;
|
||||
const bool result1 = symbol_table.add_function("x", x);
|
||||
const bool result2 = symbol_table.remove_vararg_function("x");
|
||||
const bool result3 = symbol_table.remove_vararg_function("x");
|
||||
|
||||
if (!result1 || !result2 || result3)
|
||||
{
|
||||
printf("run_test18() - Failed sym_tab add/remove [5]\n");
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
symbol_table.add_function("foo1",foo1);
|
||||
symbol_table.add_function("foo2",foo2);
|
||||
symbol_table.add_function("foo3",foo3);
|
||||
symbol_table.add_function("foo4",foo4);
|
||||
symbol_table.add_function("foo5",foo5);
|
||||
symbol_table.add_function("foo6",foo6);
|
||||
|
||||
symbol_table.remove_function("foo1");
|
||||
symbol_table.remove_function("foo2");
|
||||
symbol_table.remove_function("foo3");
|
||||
symbol_table.remove_function("foo4");
|
||||
symbol_table.remove_function("foo5");
|
||||
symbol_table.remove_function("foo6");
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
|
||||
|
@ -6001,8 +6374,8 @@ inline bool run_test18()
|
|||
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
T x = T(33);
|
||||
T y = T(77);
|
||||
|
@ -6100,8 +6473,8 @@ inline bool run_test18()
|
|||
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
T x = T(33);
|
||||
T y = T(77);
|
||||
|
@ -6278,8 +6651,8 @@ inline bool run_test18()
|
|||
for (std::size_t i = 0; i < expression_list_size; ++i)
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
T x = T(33);
|
||||
T y = T(77);
|
||||
|
@ -6395,8 +6768,8 @@ inline bool run_test18()
|
|||
std::string s4 = "XXXXXXXXXXXXXXX";
|
||||
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
symbol_table_t symbol_table;
|
||||
|
||||
|
@ -6448,7 +6821,7 @@ inline bool run_test18()
|
|||
return false;
|
||||
}
|
||||
|
||||
T result = expression.value();
|
||||
const T result = expression.value();
|
||||
|
||||
if (result != T(1))
|
||||
{
|
||||
|
@ -6508,8 +6881,8 @@ inline bool run_test18()
|
|||
bool failure = false;
|
||||
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
symbol_table_t symbol_table;
|
||||
|
||||
|
@ -6579,8 +6952,8 @@ inline bool run_test18()
|
|||
bool failure = false;
|
||||
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
std::vector<T> v0;
|
||||
std::vector<T> v1;
|
||||
|
@ -6666,8 +7039,8 @@ inline bool run_test18()
|
|||
bool failure = false;
|
||||
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
std::vector<T> v0;
|
||||
std::vector<T> s;
|
||||
|
@ -6729,8 +7102,8 @@ inline bool run_test18()
|
|||
bool failure = false;
|
||||
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
std::vector<T> v0;
|
||||
std::vector<T> s;
|
||||
|
@ -6792,8 +7165,8 @@ inline bool run_test18()
|
|||
bool failure = false;
|
||||
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
std::vector<T> v0;
|
||||
std::vector<T> s;
|
||||
|
@ -6853,8 +7226,8 @@ inline bool run_test18()
|
|||
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
T v0[] = { T(0), T(1), T(2), T(3), T(4) };
|
||||
T v1[] = { T(5), T(6), T(7), T(8), T(9) };
|
||||
|
@ -6917,8 +7290,8 @@ inline bool run_test18()
|
|||
bool failure = false;
|
||||
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
exprtk::rtl::vecops::package<T> vecops_pkg;
|
||||
|
||||
|
@ -7041,7 +7414,7 @@ inline bool run_test18()
|
|||
continue;
|
||||
}
|
||||
|
||||
T result = expression.value();
|
||||
const T result = expression.value();
|
||||
|
||||
if (result != T(1))
|
||||
{
|
||||
|
@ -7351,11 +7724,11 @@ inline bool run_test18()
|
|||
template <typename T>
|
||||
inline bool run_test19()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::function_compositor<T> compositor_t;
|
||||
typedef typename compositor_t::function function_t;
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::function_compositor<T> compositor_t;
|
||||
typedef typename compositor_t::function function_t;
|
||||
|
||||
{
|
||||
T x = T(123.123);
|
||||
|
@ -7564,7 +7937,7 @@ inline bool run_test19()
|
|||
continue;
|
||||
}
|
||||
|
||||
T result = expression.value();
|
||||
const T result = expression.value();
|
||||
|
||||
if (result_list[i] != result)
|
||||
{
|
||||
|
@ -8061,15 +8434,15 @@ inline bool run_test19()
|
|||
{
|
||||
x = static_cast<T>(i);
|
||||
|
||||
T result = expression.value();
|
||||
const T result = expression.value();
|
||||
|
||||
if (not_equal(result,std::sqrt(x),T(0.0000001)))
|
||||
{
|
||||
printf("run_test19() - Computation Error "
|
||||
"Expression: [%s]\tExpected: %12.8f\tResult: %12.8f\n",
|
||||
expression_str.c_str(),
|
||||
(double)std::sqrt(x),
|
||||
(double)result);
|
||||
static_cast<double>(std::sqrt(x)),
|
||||
static_cast<double>(result));
|
||||
|
||||
failure = true;
|
||||
}
|
||||
|
@ -8191,7 +8564,7 @@ inline bool run_test19()
|
|||
|
||||
sum += x;
|
||||
|
||||
T result = expression.value();
|
||||
const T result = expression.value();
|
||||
|
||||
if (result != sum)
|
||||
{
|
||||
|
@ -8684,8 +9057,8 @@ template <typename T>
|
|||
inline bool run_test21()
|
||||
{
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
T x = T(1.1);
|
||||
T y = T(2.2);
|
||||
|
|
78
readme.txt
78
readme.txt
|
@ -59,7 +59,7 @@ arithmetic operations, functions and processes:
|
|||
|
||||
(05) Functions: abs, avg, ceil, clamp, equal, erf, erfc, exp,
|
||||
expm1, floor, frac, log, log10, log1p, log2,
|
||||
logn, max, min, mul, ncdf, nequal, root,
|
||||
logn, max, min, mul, ncdf, not_equal, root,
|
||||
round, roundn, sgn, sqrt, sum, swap, trunc
|
||||
|
||||
(06) Trigonometry: acos, acosh, asin, asinh, atan, atanh, atan2,
|
||||
|
@ -124,7 +124,7 @@ The most recent version of the C++ Mathematical Expression Toolkit
|
|||
Library including all updates and tests can be found at the following
|
||||
locations:
|
||||
|
||||
(a) Download: http://www.partow.net/programming/exprtk/index.html
|
||||
(a) Download: https://www.partow.net/programming/exprtk/index.html
|
||||
(b) Repository: https://github.com/ArashPartow/exprtk
|
||||
https://github.com/ArashPartow/exprtk-extras
|
||||
|
||||
|
@ -321,7 +321,7 @@ of C++ compilers:
|
|||
+----------+---------------------------------------------------------+
|
||||
| ncdf | Normal cumulative distribution function. (eg: ncdf(x)) |
|
||||
+----------+---------------------------------------------------------+
|
||||
| nequal | Not-equal test between x and y using normalised epsilon |
|
||||
| not_equal| Not-equal test between x and y using normalised epsilon |
|
||||
+----------+---------------------------------------------------------+
|
||||
| pow | x to the power of y. (eg: pow(x,y) == x ^ y) |
|
||||
+----------+---------------------------------------------------------+
|
||||
|
@ -767,8 +767,8 @@ normally would in a program, and when the expression is evaluated the
|
|||
current values assigned to the variables will be used.
|
||||
|
||||
typedef exprtk::symbol_table<double> symbol_table_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
typedef exprtk::parser<double> parser_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
typedef exprtk::parser<double> parser_t;
|
||||
|
||||
symbol_table_t symbol_table;
|
||||
expression_t expression;
|
||||
|
@ -811,8 +811,8 @@ expansive discussion please review section [17 - Hierarchies Of
|
|||
Symbol Tables]
|
||||
|
||||
typedef exprtk::symbol_table<double> symbol_table_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
typedef exprtk::parser<double> parser_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
typedef exprtk::parser<double> parser_t;
|
||||
|
||||
symbol_table_t symbol_table0;
|
||||
symbol_table_t symbol_table1;
|
||||
|
@ -869,7 +869,7 @@ a false result due to one or more of the following reasons:
|
|||
|
||||
|
||||
(2) Expression
|
||||
A structure that holds an abstract syntax tree or AST for a specified
|
||||
A structure that holds an Abstract Syntax Tree or AST for a specified
|
||||
expression and is used to evaluate said expression. Evaluation of the
|
||||
expression is accomplished by performing a post-order traversal of the
|
||||
AST. If a compiled Expression uses variables or user defined
|
||||
|
@ -1342,7 +1342,7 @@ noted:
|
|||
|
||||
|
||||
Note: In example 6 from the above set, it is assumed the user defined
|
||||
function foo has been registered as having a side_effect. By default
|
||||
function foo has been registered as having a side-effect. By default
|
||||
all user defined functions are assumed to have side-effects, unless
|
||||
they are configured in their constructors to not have side-effects
|
||||
using the 'disable_has_side_effects' free function. For more
|
||||
|
@ -2322,8 +2322,8 @@ methods, composited functions and implicitly registering the functions
|
|||
with the denoted symbol table.
|
||||
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::function_compositor<T> compositor_t;
|
||||
typedef typename compositor_t::function function_t;
|
||||
typedef exprtk::function_compositor<T> compositor_t;
|
||||
typedef typename compositor_t::function function_t;
|
||||
|
||||
symbol_table_t symbol_table;
|
||||
|
||||
|
@ -2351,11 +2351,11 @@ expression, an instance of each function needs to be registered with a
|
|||
symbol_table that has been associated with the expression instance.
|
||||
The following demonstrates how all the pieces are put together:
|
||||
|
||||
typedef exprtk::symbol_table<double> symbol_table_t;
|
||||
typedef exprtk::symbol_table<double> symbol_table_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
typedef exprtk::parser<double> parser_t;
|
||||
typedef exprtk::parser<double> parser_t;
|
||||
typedef exprtk::function_compositor<double> compositor_t;
|
||||
typedef typename compositor_t::function function_t;
|
||||
typedef typename compositor_t::function function_t;
|
||||
|
||||
foo<double> f;
|
||||
boo<double> b;
|
||||
|
@ -2747,7 +2747,7 @@ expression that makes use of various elements of each symbol table is
|
|||
then compiled and later on evaluated:
|
||||
|
||||
typedef exprtk::symbol_table<double> symbol_table_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
|
||||
// Setup global constants symbol table
|
||||
symbol_table_t glbl_const_symbol_table;
|
||||
|
@ -2908,8 +2908,8 @@ variables with the latter method using the 'unknown_symbol_resolver'
|
|||
component.
|
||||
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
symbol_table_t unknown_var_symbol_table;
|
||||
|
||||
|
@ -2981,8 +2981,8 @@ should raise a compilation error. The following example demonstrates a
|
|||
simple user defined USR:
|
||||
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
template <typename T>
|
||||
struct my_usr : public parser_t::unknown_symbol_resolver
|
||||
|
@ -3458,8 +3458,8 @@ redefined as a function taking degree input.
|
|||
...
|
||||
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
typedef typename parser_t::settings_store settings_t;
|
||||
|
||||
|
@ -3511,8 +3511,8 @@ expression will return normally.
|
|||
" return [x, y, x + y, x - y, 'return-call 3'] ";
|
||||
|
||||
typedef exprtk::symbol_table<double> symbol_table_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
typedef exprtk::parser<double> parser_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
typedef exprtk::parser<double> parser_t;
|
||||
|
||||
symbol_table_t symbol_table;
|
||||
expression_t expression;
|
||||
|
@ -3574,8 +3574,8 @@ itself to have the result variables be assigned the appropriate
|
|||
values.
|
||||
|
||||
typedef exprtk::symbol_table<double> symbol_table_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
typedef exprtk::parser<double> parser_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
typedef exprtk::parser<double> parser_t;
|
||||
|
||||
std::string expression_string =
|
||||
" var x := 123.456; "
|
||||
|
@ -3751,8 +3751,8 @@ expression's associated symbol table. In the following example, the
|
|||
file I/O package is made available for the given expression:
|
||||
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
exprtk::rtl::io::file::package<T> fileio_package;
|
||||
|
||||
|
@ -3980,9 +3980,9 @@ Simpson's rule. The integrate function has two overloads, where the
|
|||
variable of integration can either be passed as a reference or as a
|
||||
name in string form. Example usage of the function is as follows:
|
||||
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
std::string expression_string = "sqrt(1 - (x^2))";
|
||||
|
||||
|
@ -4015,9 +4015,9 @@ where the variable of differentiation can either be passed as a
|
|||
reference or as a name in string form. Example usage of the derivative
|
||||
function is as follows:
|
||||
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
std::string expression_string = "sqrt(1 - (x^2))";
|
||||
|
||||
|
@ -4054,9 +4054,9 @@ variable of differentiation can either be passed as a reference or as
|
|||
a name in string form. Example usage of the second_derivative function
|
||||
is as follows:
|
||||
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
std::string expression_string = "sqrt(1 - (x^2))";
|
||||
|
||||
|
@ -4093,9 +4093,9 @@ variable of differentiation can either be passed as a reference or as
|
|||
a name in string form. Example usage of the third_derivative function
|
||||
is as follows:
|
||||
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::symbol_table<T> symbol_table_t;
|
||||
typedef exprtk::expression<T> expression_t;
|
||||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
std::string expression_string = "sqrt(1 - (x^2))";
|
||||
|
||||
|
@ -4310,7 +4310,7 @@ into account when using ExprTk:
|
|||
of that symbol-table, otherwise the result will be undefined
|
||||
behavior.
|
||||
|
||||
(10) Equal and Nequal are normalised-epsilon equality routines,
|
||||
(10) Equal and not_equal are normalised-epsilon equality routines,
|
||||
which use epsilons of 0.0000000001 and 0.000001 for double and
|
||||
float types respectively.
|
||||
|
||||
|
@ -4517,9 +4517,9 @@ struct myfunc : public exprtk::ifunction<T>
|
|||
int main()
|
||||
{
|
||||
typedef exprtk::symbol_table<double> symbol_table_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
typedef exprtk::parser<double> parser_t;
|
||||
typedef exprtk::parser_error::type error_t;
|
||||
typedef exprtk::expression<double> expression_t;
|
||||
typedef exprtk::parser<double> parser_t;
|
||||
typedef exprtk::parser_error::type error_t;
|
||||
|
||||
std::string expression_str =
|
||||
"z := 2 myfunc([4 + sin(x / pi)^3],y ^ 2)";
|
||||
|
|
Loading…
Reference in New Issue