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 - image: gcc:6
steps: steps:
- checkout - checkout
- run: c++ --version
- run: make all -j 2 - run: make all -j 2
- run: ./exprtk_test - run: ./exprtk_test
@ -14,6 +15,7 @@ jobs:
- image: gcc:7 - image: gcc:7
steps: steps:
- checkout - checkout
- run: c++ --version
- run: make all -j 2 - run: make all -j 2
- run: ./exprtk_test - run: ./exprtk_test
@ -22,6 +24,7 @@ jobs:
- image: gcc:latest - image: gcc:latest
steps: steps:
- checkout - checkout
- run: c++ --version
- run: make all -j 2 - run: make all -j 2
- run: ./exprtk_test - run: ./exprtk_test

View File

@ -2,7 +2,7 @@
# ************************************************************** # **************************************************************
# * C++ Mathematical Expression Toolkit Library * # * C++ Mathematical Expression Toolkit Library *
# * * # * *
# * Author: Arash Partow (1999-2020) * # * Author: Arash Partow (1999-2021) *
# * URL: http://www.partow.net/programming/exprtk/index.html * # * URL: http://www.partow.net/programming/exprtk/index.html *
# * * # * *
# * Copyright notice: * # * 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 * * C++ Mathematical Expression Toolkit Library *
* * * *
* ExprTk vs Native Benchmarks * * ExprTk vs Native Benchmarks *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -150,7 +150,7 @@ template <typename T>
bool run_parse_benchmark(exprtk::symbol_table<T>& symbol_table) bool run_parse_benchmark(exprtk::symbol_table<T>& symbol_table)
{ {
static const std::size_t rounds = 100000; static const std::size_t rounds = 100000;
exprtk::parser<double> parser; exprtk::parser<double> parser;
exprtk::expression<double> expression; exprtk::expression<double> expression;
expression.register_symbol_table(symbol_table); 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); void perform_file_based_benchmark(const std::string& file_name, const std::size_t& rounds = 100000);
int main(int argc, char* argv[]) int main(int argc, char* argv[])
@ -359,7 +359,7 @@ int main(int argc, char* argv[])
return 0; return 0;
} }
void pgo_primer() double pgo_primer()
{ {
exprtk::pgo_primer<double>(); exprtk::pgo_primer<double>();
@ -394,6 +394,8 @@ void pgo_primer()
total += native<double>::func16(x,y); 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) 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::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t; typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t; typedef exprtk::parser<double> parser_t;
std::deque<expression_t> expression_list; 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((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((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((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 * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 1 * * Simple Example 1 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -26,8 +26,8 @@ template <typename T>
void trig_function() void trig_function()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string expression_string = const std::string expression_string =
"clamp(-1.0,sin(2 * pi * x) + cos(x / 2 * pi),+1.0)"; "clamp(-1.0,sin(2 * pi * x) + cos(x / 2 * pi),+1.0)";

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 2 * * Simple Example 2 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -26,8 +26,8 @@ template <typename T>
void square_wave() void square_wave()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string expr_string = const std::string expr_string =
"a*(4/pi)*" "a*(4/pi)*"

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 3 * * Simple Example 3 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -26,8 +26,8 @@ template <typename T>
void polynomial() void polynomial()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string expression_string = const std::string expression_string =
"25x^5 - 35x^4 - 15x^3 + 40x^2 - 15x + 1"; "25x^5 - 35x^4 - 15x^3 + 40x^2 - 15x + 1";

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 4 * * Simple Example 4 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -25,11 +25,11 @@
template <typename T> template <typename T>
void fibonacci() void fibonacci()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
typedef exprtk::function_compositor<T> compositor_t; typedef exprtk::function_compositor<T> compositor_t;
typedef typename compositor_t::function function_t; typedef typename compositor_t::function function_t;
compositor_t compositor; compositor_t compositor;

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 5 * * Simple Example 5 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -47,8 +47,8 @@ template <typename T>
void custom_function() void custom_function()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string expression_string = const std::string expression_string =
"myfunc(sin(x / pi), otherfunc(3 * y, x / 2, x * y))"; "myfunc(sin(x / pi), otherfunc(3 * y, x / 2, x * y))";

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 6 * * Simple Example 6 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -26,8 +26,8 @@ template <typename T>
void vector_function() void vector_function()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string expression_string = const std::string expression_string =
" for (var i := 0; i < min(x[],y[],z[]); i += 1) " " for (var i := 0; i < min(x[],y[],z[]); i += 1) "

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 7 * * Simple Example 7 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -26,8 +26,8 @@ template <typename T>
void logic() void logic()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string expression_string = "not(A and B) or C"; const std::string expression_string = "not(A and B) or C";

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 8 * * Simple Example 8 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -25,12 +25,12 @@
template <typename T> template <typename T>
void composite() void composite()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
typedef exprtk::parser_error::type err_t; typedef exprtk::parser_error::type error_t;
typedef exprtk::function_compositor<T> compositor_t; typedef exprtk::function_compositor<T> compositor_t;
typedef typename compositor_t::function function_t; typedef typename compositor_t::function function_t;
compositor_t compositor; compositor_t compositor;
@ -65,7 +65,7 @@ void composite()
for (std::size_t i = 0; i < parser.error_count(); ++i) 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", printf("Error: %02d Position: %02d Type: [%14s] Msg: %s\tExpression: %s\n",
static_cast<unsigned int>(i), static_cast<unsigned int>(i),

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 9 * * Simple Example 9 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -25,11 +25,11 @@
template <typename T> template <typename T>
void primes() void primes()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
typedef exprtk::function_compositor<T> compositor_t; typedef exprtk::function_compositor<T> compositor_t;
typedef typename compositor_t::function function_t; typedef typename compositor_t::function function_t;
T x = T(0); T x = T(0);

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 10 * * Simple Example 10 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -26,11 +26,11 @@
template <typename T> template <typename T>
void newton_sqrt() void newton_sqrt()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
typedef exprtk::function_compositor<T> compositor_t; typedef exprtk::function_compositor<T> compositor_t;
typedef typename compositor_t::function function_t; typedef typename compositor_t::function function_t;
T x = T(0); T x = T(0);

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 11 * * Simple Example 11 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -26,8 +26,8 @@ template <typename T>
void square_wave2() void square_wave2()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string wave_program = const std::string wave_program =
" var r := 0; " " var r := 0; "

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 12 * * Simple Example 12 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -26,8 +26,8 @@ template <typename T>
void bubble_sort() void bubble_sort()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string bubblesort_program = const std::string bubblesort_program =
" var upper_bound := v[]; " " var upper_bound := v[]; "

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 13 * * Simple Example 13 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -28,8 +28,8 @@ template <typename T>
void savitzky_golay_filter() void savitzky_golay_filter()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string sgfilter_program = const std::string sgfilter_program =
" var weight[9] := " " var weight[9] := "
@ -69,15 +69,15 @@ void savitzky_golay_filter()
// Generate a signal with noise. // Generate a signal with noise.
for (T t = T(-5); t <= T(+5); t += T(10.0 / n)) 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_in.push_back(sin(2.0 * pi * t) + noise);
} }
v_out.resize(v_in.size()); v_out.resize(v_in.size());
symbol_table_t symbol_table; symbol_table_t symbol_table;
symbol_table.add_vector("v_in" , v_in); symbol_table.add_vector("v_in" , v_in );
symbol_table.add_vector("v_out",v_out); symbol_table.add_vector("v_out", v_out);
expression_t expression; expression_t expression;
expression.register_symbol_table(symbol_table); expression.register_symbol_table(symbol_table);

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 14 * * Simple Example 14 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -26,7 +26,7 @@ template <typename T>
void stddev_example() void stddev_example()
{ {
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string stddev_program = const std::string stddev_program =
" var x[25] := { " " var x[25] := { "

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 15 * * Simple Example 15 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -26,8 +26,8 @@ template <typename T>
void black_scholes_merton_model() void black_scholes_merton_model()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string bsm_model_program = const std::string bsm_model_program =
" var d1 := (log(s / x) + (r + v^2 / 2) * t) / (v * sqrt(t)); " " 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"; 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", printf("BSM(%s,%5.3f,%5.3f,%5.3f,%5.3f,%5.3f) = %10.6f\n",
callput_flag.c_str(), callput_flag.c_str(),
@ -78,7 +78,7 @@ void black_scholes_merton_model()
{ {
callput_flag = "put"; 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", printf("BSM(%s,%5.3f,%5.3f,%5.3f,%5.3f,%5.3f) = %10.6f\n",
callput_flag.c_str(), callput_flag.c_str(),

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 16 * * Simple Example 16 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -27,8 +27,8 @@ template <typename T>
void linear_least_squares() void linear_least_squares()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string linear_least_squares_program = const std::string linear_least_squares_program =
" if (x[] == y[]) " " if (x[] == y[]) "
@ -55,11 +55,11 @@ void linear_least_squares()
T rmse = T(0); T rmse = T(0);
symbol_table_t symbol_table; symbol_table_t symbol_table;
symbol_table.add_variable("alpha",alpha); symbol_table.add_variable("alpha", alpha);
symbol_table.add_variable("beta" ,beta ); symbol_table.add_variable("beta" , beta );
symbol_table.add_variable("rmse" ,rmse ); symbol_table.add_variable("rmse" , rmse );
symbol_table.add_vector ("x" ,x ); symbol_table.add_vector ("x" , x );
symbol_table.add_vector ("y" ,y ); symbol_table.add_vector ("y" , y );
expression_t expression; expression_t expression;
expression.register_symbol_table(symbol_table); expression.register_symbol_table(symbol_table);
@ -69,10 +69,10 @@ void linear_least_squares()
expression.value(); expression.value();
printf("alpha: %15.12f\n",alpha); printf("alpha: %15.12f\n", alpha);
printf("beta: %15.12f\n",beta ); printf("beta: %15.12f\n", beta );
printf("rmse: %15.12f\n",rmse ); printf("rmse: %15.12f\n", rmse );
printf("y = %15.12fx + %15.12f\n",beta,alpha); printf("y = %15.12fx + %15.12f\n", beta, alpha);
} }
int main() int main()

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 17 * * Simple Example 17 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -44,8 +44,8 @@ template <typename T>
void monte_carlo_pi() void monte_carlo_pi()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string monte_carlo_pi_program = const std::string monte_carlo_pi_program =
" var experiments[5 * 10^7] := [(rnd_01^2 + rnd_01^2) <= 1]; " " var experiments[5 * 10^7] := [(rnd_01^2 + rnd_01^2) <= 1]; "

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 18 * * Simple Example 18 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -26,8 +26,8 @@ template <typename T>
void file_io() void file_io()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string fileio_program = const std::string fileio_program =
" var file_name := 'file.txt'; " " var file_name := 'file.txt'; "

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 19 * * Simple Example 19 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -81,8 +81,8 @@ template <typename T>
void vector_randu() void vector_randu()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
const std::string vecrandu_program = const std::string vecrandu_program =
" var noise[6] := [0]; " " var noise[6] := [0]; "
@ -109,9 +109,9 @@ void vector_randu()
randu<T> randu; randu<T> randu;
symbol_table_t symbol_table; symbol_table_t symbol_table;
symbol_table.add_vector ("signal" , signal); symbol_table.add_vector ("signal" , signal );
symbol_table.add_function("println",println); symbol_table.add_function("println", println);
symbol_table.add_function("randu" , randu); symbol_table.add_function("randu" , randu );
expression_t expression; expression_t expression;
expression.register_symbol_table(symbol_table); expression.register_symbol_table(symbol_table);

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Examples and Unit-Tests * * Examples and Unit-Tests *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -358,6 +358,42 @@ static const test_t global_test_list[] =
test_t("( 7 - 2 )",+5.0), test_t("( 7 - 2 )",+5.0),
test_t("( 8 - 1 )",+7.0), test_t("( 8 - 1 )",+7.0),
test_t("( 9 - 0 )",+9.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)",+3.0), test_t("+(1+2)",+3.0),
test_t("+(1-2)",-1.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; return false;
} }
T result = expression.value(); const T result = expression.value();
if (not_equal(result,expected_result)) if (not_equal(result,expected_result))
{ {
printf("test_expression() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n", printf("test_expression() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
expression_string.c_str(), expression_string.c_str(),
(double)expected_result, static_cast<double>(expected_result),
(double)result); static_cast<double>(result));
return false; return false;
} }
@ -1177,6 +1213,43 @@ inline bool test_expression(const std::string& expression_string, const T& expec
return true; 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> template <typename T>
inline bool run_test00() 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; 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>("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>("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>("(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>("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>("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>("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.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>("x - -1 " ,T(1.0),T(0.0),T(2)),
test_xy<T>("1 * x == x" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("x --1 " ,T(1.0),T(0.0),T(2)),
test_xy<T>("y * 1 == y" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("x-- 1 " ,T(1.0),T(0.0),T(2)),
test_xy<T>("1 * y == y" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("x--1 " ,T(1.0),T(0.0),T(2)),
test_xy<T>("x * 0 == 0" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("x -- -1" ,T(1.0),T(0.0),T(0)),
test_xy<T>("0 * x == 0" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("x + -1 " ,T(1.0),T(0.0),T(0)),
test_xy<T>("y * 0 == 0" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("x +-1 " ,T(1.0),T(0.0),T(0)),
test_xy<T>("0 * y == 0" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("x+- 1 " ,T(1.0),T(0.0),T(0)),
test_xy<T>("x + 1 == 1 + x",T(2.0),T(3.0),T(1.0)), test_xy<T>("x+-1 " ,T(1.0),T(0.0),T(0)),
test_xy<T>("y + 1 == 1 + y",T(2.0),T(3.0),T(1.0)), test_xy<T>("x +- -1" ,T(1.0),T(0.0),T(2)),
test_xy<T>("x + y == y + x",T(2.0),T(3.0),T(1.0)), test_xy<T>("x + +1 " ,T(1.0),T(0.0),T(2)),
test_xy<T>("x * y == y * x",T(2.0),T(3.0),T(1.0)), test_xy<T>("x ++1 " ,T(1.0),T(0.0),T(2)),
test_xy<T>("x < y" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("1 - -x " ,T(1.0),T(0.0),T(2)),
test_xy<T>("y > x" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("1 --x " ,T(1.0),T(0.0),T(2)),
test_xy<T>("x <= y" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("1-- x " ,T(1.0),T(0.0),T(2)),
test_xy<T>("y >= x" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("1--x " ,T(1.0),T(0.0),T(2)),
test_xy<T>("x + y > y" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("1 -- -x" ,T(1.0),T(0.0),T(0)),
test_xy<T>("x + y > x" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("1 + -x " ,T(1.0),T(0.0),T(0)),
test_xy<T>("x * y > y" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("1 +-x " ,T(1.0),T(0.0),T(0)),
test_xy<T>("x * y > x" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("1+- x " ,T(1.0),T(0.0),T(0)),
test_xy<T>("(x + y) > y" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("1+-x " ,T(1.0),T(0.0),T(0)),
test_xy<T>("(x + y) > x" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("1 +- -x" ,T(1.0),T(0.0),T(2)),
test_xy<T>("(x * y) > y" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("1 + +x " ,T(1.0),T(0.0),T(2)),
test_xy<T>("(x * y) > x" ,T(2.0),T(3.0),T(1.0)), 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>("(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>("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)), 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)) if (not_equal(result,test.result))
{ {
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n", printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
test.expr.c_str(), test.expr.c_str(),
(double)test.result, static_cast<double>(test.result),
(double)result); static_cast<double>(result));
loop_result = false; 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)) if (not_equal(result,test.result))
{ {
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n", printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
test.expr.c_str(), test.expr.c_str(),
(double)test.result, static_cast<double>(test.result),
(double)result); static_cast<double>(result));
loop_result = false; 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))) if (not_equal(result,T(1)))
{ {
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n", printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
expr_list[i].c_str(), expr_list[i].c_str(),
(double)1.0, static_cast<double>(1.0),
(double)result); static_cast<double>(result));
loop_result = false; 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))) if (not_equal(result,T(1)))
{ {
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n", printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
expr_list[i].c_str(), expr_list[i].c_str(),
(double)1.0, static_cast<double>(1.0),
(double)result); static_cast<double>(result));
loop_result = false; 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+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 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: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: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)), 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" printf("run_test02() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\t"
"a='%s'\tb='%s'\tc='%s'\n", "a='%s'\tb='%s'\tc='%s'\n",
test.expr.c_str(), test.expr.c_str(),
(double)test.result, static_cast<double>(test.result),
(double)expr_result, static_cast<double>(expr_result),
str_a.c_str(), str_a.c_str(),
str_b.c_str(), str_b.c_str(),
str_c.c_str()); str_c.c_str());
@ -2676,8 +2851,8 @@ template <typename T>
inline bool run_test03() inline bool run_test03()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_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+" 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+" "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", printf("run_test04() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\n",
expression_string.c_str(), expression_string.c_str(),
(double)result1, static_cast<double>(result1),
(double)result2, static_cast<double>(result2),
(double)x, static_cast<double>(x),
(double)y); static_cast<double>(y));
return false; 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", 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(), expression_string.c_str(),
(double)real_result, static_cast<double>(real_result),
(double)result, static_cast<double>(result),
(double)x, static_cast<double>(x),
(double)y, static_cast<double>(y),
static_cast<unsigned int>(i)); static_cast<unsigned int>(i));
return false; return false;
@ -3140,8 +3315,8 @@ inline bool run_test06()
if (not_equal(total_area1,T(pi) / T(2),T(0.000001))) if (not_equal(total_area1,T(pi) / T(2),T(0.000001)))
{ {
printf("run_test06() - Integration Error: Expected: %19.15f\tResult: %19.15f\n", printf("run_test06() - Integration Error: Expected: %19.15f\tResult: %19.15f\n",
(double)(pi / T(2)), static_cast<double>(pi / T(2)),
(double)total_area1); static_cast<double>(total_area1));
return false; return false;
} }
@ -3192,9 +3367,9 @@ inline bool run_test07()
if (not_equal(deriv1_result1,deriv1_real_result,T(0.00001))) 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", printf("run_test07() - 1st Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
(double)x, static_cast<double>(x),
(double)deriv1_real_result, static_cast<double>(deriv1_real_result),
(double)deriv1_result1); static_cast<double>(deriv1_result1));
return false; return false;
} }
@ -3214,9 +3389,9 @@ inline bool run_test07()
if (not_equal(deriv2_result1,deriv2_real_result,T(0.01))) 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", printf("run_test07() - 2nd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
(double)x, static_cast<double>(x),
(double)deriv2_real_result, static_cast<double>(deriv2_real_result),
(double)deriv2_result1); static_cast<double>(deriv2_result1));
return false; return false;
} }
@ -3236,9 +3411,9 @@ inline bool run_test07()
if (not_equal(deriv3_result1,deriv3_real_result,T(0.01))) 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", printf("run_test07() - 3rd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
(double)x, static_cast<double>(x),
(double)deriv3_real_result, static_cast<double>(deriv3_real_result),
(double)deriv3_result1); static_cast<double>(deriv3_result1));
return false; return false;
} }
@ -3526,9 +3701,9 @@ inline bool run_test09()
const T pi = T(3.141592653589793238462643383279502); 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)) +
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))) if (not_equal(result,expected,T(0.0000001)))
{ {
printf("run_test09() - Error Expected: %19.15f\tResult: %19.15f\n", printf("run_test09() - Error Expected: %19.15f\tResult: %19.15f\n",
(double)expected, static_cast<double>(expected),
(double)result); static_cast<double>(result));
return false; return false;
} }
@ -4311,6 +4486,78 @@ inline bool run_test10()
{ {
"var x; 1", "var x; 1",
"var x := 1; x", "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; 1",
"var x := 1; var y := 2; x", "var x := 1; var y := 2; x",
"var x:=6; var y:=4; x + -3 == 3", "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; 'abc' + s; s} == s ",
"var s := 'abc'; ~{1 + 2; var x := 'ab'; x + 'c'} == 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); 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) if (T(1) != result)
{ {
@ -4699,7 +4982,7 @@ inline bool run_test10()
continue; continue;
} }
T result = expression.value(); const T result = expression.value();
if (T(1) != result) if (T(1) != result)
{ {
@ -4927,8 +5210,8 @@ template <typename T>
inline bool run_test13() inline bool run_test13()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
static const std::string expression_string[] = static const std::string expression_string[] =
{ {
@ -5287,8 +5570,8 @@ inline bool run_test15()
if (not_equal(base_result,result)) if (not_equal(base_result,result))
{ {
printf("run_test15() - Error in evaluation! (1) Base: %20.10f\tResult: %20.10f\tExpression: %s\n", printf("run_test15() - Error in evaluation! (1) Base: %20.10f\tResult: %20.10f\tExpression: %s\n",
(double)base_result, static_cast<double>(base_result),
(double)result, static_cast<double>(result),
expr_str_list[i].c_str()); expr_str_list[i].c_str());
failure = true; failure = true;
@ -5917,6 +6200,96 @@ struct overload_func : exprtk::igeneric_function<T>
template <typename T> template <typename T>
inline bool run_test18() 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; typedef exprtk::expression<T> expression_t;
@ -6001,8 +6374,8 @@ inline bool run_test18()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
T x = T(33); T x = T(33);
T y = T(77); T y = T(77);
@ -6100,8 +6473,8 @@ inline bool run_test18()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
T x = T(33); T x = T(33);
T y = T(77); T y = T(77);
@ -6278,8 +6651,8 @@ inline bool run_test18()
for (std::size_t i = 0; i < expression_list_size; ++i) for (std::size_t i = 0; i < expression_list_size; ++i)
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
T x = T(33); T x = T(33);
T y = T(77); T y = T(77);
@ -6395,8 +6768,8 @@ inline bool run_test18()
std::string s4 = "XXXXXXXXXXXXXXX"; std::string s4 = "XXXXXXXXXXXXXXX";
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
symbol_table_t symbol_table; symbol_table_t symbol_table;
@ -6448,7 +6821,7 @@ inline bool run_test18()
return false; return false;
} }
T result = expression.value(); const T result = expression.value();
if (result != T(1)) if (result != T(1))
{ {
@ -6508,8 +6881,8 @@ inline bool run_test18()
bool failure = false; bool failure = false;
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
symbol_table_t symbol_table; symbol_table_t symbol_table;
@ -6579,8 +6952,8 @@ inline bool run_test18()
bool failure = false; bool failure = false;
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
std::vector<T> v0; std::vector<T> v0;
std::vector<T> v1; std::vector<T> v1;
@ -6666,8 +7039,8 @@ inline bool run_test18()
bool failure = false; bool failure = false;
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
std::vector<T> v0; std::vector<T> v0;
std::vector<T> s; std::vector<T> s;
@ -6729,8 +7102,8 @@ inline bool run_test18()
bool failure = false; bool failure = false;
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
std::vector<T> v0; std::vector<T> v0;
std::vector<T> s; std::vector<T> s;
@ -6792,8 +7165,8 @@ inline bool run_test18()
bool failure = false; bool failure = false;
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
std::vector<T> v0; std::vector<T> v0;
std::vector<T> s; std::vector<T> s;
@ -6853,8 +7226,8 @@ inline bool run_test18()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
T v0[] = { T(0), T(1), T(2), T(3), T(4) }; T v0[] = { T(0), T(1), T(2), T(3), T(4) };
T v1[] = { T(5), T(6), T(7), T(8), T(9) }; T v1[] = { T(5), T(6), T(7), T(8), T(9) };
@ -6917,8 +7290,8 @@ inline bool run_test18()
bool failure = false; bool failure = false;
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
exprtk::rtl::vecops::package<T> vecops_pkg; exprtk::rtl::vecops::package<T> vecops_pkg;
@ -7041,7 +7414,7 @@ inline bool run_test18()
continue; continue;
} }
T result = expression.value(); const T result = expression.value();
if (result != T(1)) if (result != T(1))
{ {
@ -7351,11 +7724,11 @@ inline bool run_test18()
template <typename T> template <typename T>
inline bool run_test19() inline bool run_test19()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
typedef exprtk::function_compositor<T> compositor_t; typedef exprtk::function_compositor<T> compositor_t;
typedef typename compositor_t::function function_t; typedef typename compositor_t::function function_t;
{ {
T x = T(123.123); T x = T(123.123);
@ -7564,7 +7937,7 @@ inline bool run_test19()
continue; continue;
} }
T result = expression.value(); const T result = expression.value();
if (result_list[i] != result) if (result_list[i] != result)
{ {
@ -8061,15 +8434,15 @@ inline bool run_test19()
{ {
x = static_cast<T>(i); x = static_cast<T>(i);
T result = expression.value(); const T result = expression.value();
if (not_equal(result,std::sqrt(x),T(0.0000001))) if (not_equal(result,std::sqrt(x),T(0.0000001)))
{ {
printf("run_test19() - Computation Error " printf("run_test19() - Computation Error "
"Expression: [%s]\tExpected: %12.8f\tResult: %12.8f\n", "Expression: [%s]\tExpected: %12.8f\tResult: %12.8f\n",
expression_str.c_str(), expression_str.c_str(),
(double)std::sqrt(x), static_cast<double>(std::sqrt(x)),
(double)result); static_cast<double>(result));
failure = true; failure = true;
} }
@ -8191,7 +8564,7 @@ inline bool run_test19()
sum += x; sum += x;
T result = expression.value(); const T result = expression.value();
if (result != sum) if (result != sum)
{ {
@ -8684,8 +9057,8 @@ template <typename T>
inline bool run_test21() inline bool run_test21()
{ {
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
T x = T(1.1); T x = T(1.1);
T y = T(2.2); 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, (05) Functions: abs, avg, ceil, clamp, equal, erf, erfc, exp,
expm1, floor, frac, log, log10, log1p, log2, 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 round, roundn, sgn, sqrt, sum, swap, trunc
(06) Trigonometry: acos, acosh, asin, asinh, atan, atanh, atan2, (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 Library including all updates and tests can be found at the following
locations: 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 (b) Repository: https://github.com/ArashPartow/exprtk
https://github.com/ArashPartow/exprtk-extras https://github.com/ArashPartow/exprtk-extras
@ -321,7 +321,7 @@ of C++ compilers:
+----------+---------------------------------------------------------+ +----------+---------------------------------------------------------+
| ncdf | Normal cumulative distribution function. (eg: ncdf(x)) | | 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) | | 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. current values assigned to the variables will be used.
typedef exprtk::symbol_table<double> symbol_table_t; typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t; typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t; typedef exprtk::parser<double> parser_t;
symbol_table_t symbol_table; symbol_table_t symbol_table;
expression_t expression; expression_t expression;
@ -811,8 +811,8 @@ expansive discussion please review section [17 - Hierarchies Of
Symbol Tables] Symbol Tables]
typedef exprtk::symbol_table<double> symbol_table_t; typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t; typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t; typedef exprtk::parser<double> parser_t;
symbol_table_t symbol_table0; symbol_table_t symbol_table0;
symbol_table_t symbol_table1; symbol_table_t symbol_table1;
@ -869,7 +869,7 @@ a false result due to one or more of the following reasons:
(2) Expression (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 and is used to evaluate said expression. Evaluation of the
expression is accomplished by performing a post-order traversal of the expression is accomplished by performing a post-order traversal of the
AST. If a compiled Expression uses variables or user defined 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 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 all user defined functions are assumed to have side-effects, unless
they are configured in their constructors to not have side-effects they are configured in their constructors to not have side-effects
using the 'disable_has_side_effects' free function. For more 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. with the denoted symbol table.
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::function_compositor<T> compositor_t; typedef exprtk::function_compositor<T> compositor_t;
typedef typename compositor_t::function function_t; typedef typename compositor_t::function function_t;
symbol_table_t symbol_table; 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. symbol_table that has been associated with the expression instance.
The following demonstrates how all the pieces are put together: 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::expression<double> expression_t;
typedef exprtk::parser<double> parser_t; typedef exprtk::parser<double> parser_t;
typedef exprtk::function_compositor<double> compositor_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; foo<double> f;
boo<double> b; 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: then compiled and later on evaluated:
typedef exprtk::symbol_table<double> symbol_table_t; 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 // Setup global constants symbol table
symbol_table_t glbl_const_symbol_table; symbol_table_t glbl_const_symbol_table;
@ -2908,8 +2908,8 @@ variables with the latter method using the 'unknown_symbol_resolver'
component. component.
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
symbol_table_t unknown_var_symbol_table; 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: simple user defined USR:
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
template <typename T> template <typename T>
struct my_usr : public parser_t::unknown_symbol_resolver 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::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
typedef typename parser_t::settings_store settings_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'] "; " return [x, y, x + y, x - y, 'return-call 3'] ";
typedef exprtk::symbol_table<double> symbol_table_t; typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t; typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t; typedef exprtk::parser<double> parser_t;
symbol_table_t symbol_table; symbol_table_t symbol_table;
expression_t expression; expression_t expression;
@ -3574,8 +3574,8 @@ itself to have the result variables be assigned the appropriate
values. values.
typedef exprtk::symbol_table<double> symbol_table_t; typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t; typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t; typedef exprtk::parser<double> parser_t;
std::string expression_string = std::string expression_string =
" var x := 123.456; " " 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: file I/O package is made available for the given expression:
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
exprtk::rtl::io::file::package<T> fileio_package; 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 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: 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::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))"; 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 reference or as a name in string form. Example usage of the derivative
function is as follows: 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::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))"; 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 a name in string form. Example usage of the second_derivative function
is as follows: 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::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))"; 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 a name in string form. Example usage of the third_derivative function
is as follows: 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::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))"; 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 of that symbol-table, otherwise the result will be undefined
behavior. 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 which use epsilons of 0.0000000001 and 0.000001 for double and
float types respectively. float types respectively.
@ -4517,9 +4517,9 @@ struct myfunc : public exprtk::ifunction<T>
int main() int main()
{ {
typedef exprtk::symbol_table<double> symbol_table_t; typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t; typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t; typedef exprtk::parser<double> parser_t;
typedef exprtk::parser_error::type error_t; typedef exprtk::parser_error::type error_t;
std::string expression_str = std::string expression_str =
"z := 2 myfunc([4 + sin(x / pi)^3],y ^ 2)"; "z := 2 myfunc([4 + sin(x / pi)^3],y ^ 2)";