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 772884eb09
26 changed files with 3099 additions and 2090 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: *

4149
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);
@ -431,8 +431,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 'abcd?' ,true )
equal('abcd' like 'abc?' ,true )
equal('abcd' like 'abc??' ,true )
equal('abcd' like 'ab???' ,true )
equal('abcd' like 'a????' ,true )
equal('abcd' like '?????' ,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('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' 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*' ,true )
equal('abcd' ilike 'abc*' ,true )
equal('abcd' ilike 'ab*' ,true )
equal('abcd' ilike 'a*' ,true )
equal('abcd' ilike 'abcd?' ,true )
equal('abcd' ilike 'abc?' ,true )
equal('abcd' ilike 'abc??' ,true )
equal('abcd' ilike 'ab???' ,true )
equal('abcd' ilike 'a????' ,true )
equal('abcd' ilike '?????' ,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('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' 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;
@ -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
@ -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;
@ -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; "
@ -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)";