C++ Mathematical Expression Library (ExprTk) https://www.partow.net/programming/exprtk/index.html

This commit is contained in:
Arash Partow 2021-01-01 00:00:00 +00:00 committed by ArashPartow
parent 93a9f44f99
commit 17ba4d15e2
26 changed files with 4516 additions and 3259 deletions

View File

@ -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

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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;

View File

@ -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)})

View File

@ -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)";

View File

@ -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)*"

View File

@ -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";

View File

@ -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;

View File

@ -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))";

View File

@ -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) "

View File

@ -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";

View File

@ -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),

View File

@ -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);

View File

@ -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);

View File

@ -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; "

View File

@ -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[]; "

View File

@ -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);

View File

@ -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] := { "

View File

@ -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(),

View File

@ -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()

View File

@ -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]; "

View File

@ -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'; "

View File

@ -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);

View File

@ -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);

View File

@ -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)";