From e0b0aa5130f2c44a1645c2928ca0516289add156 Mon Sep 17 00:00:00 2001 From: Arash Partow Date: Thu, 1 Sep 2016 09:21:23 +1000 Subject: [PATCH] C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html --- Makefile | 1 + exprtk_simple_example_09.cpp | 66 +++++++++++++++---------------- exprtk_simple_example_17.cpp | 75 ++++++++++++++++++++++++++++++++++++ readme.txt | 1 + 4 files changed, 110 insertions(+), 33 deletions(-) create mode 100644 exprtk_simple_example_17.cpp diff --git a/Makefile b/Makefile index 59a7110..9a2042e 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,7 @@ BUILD_LIST+=exprtk_simple_example_13 BUILD_LIST+=exprtk_simple_example_14 BUILD_LIST+=exprtk_simple_example_15 BUILD_LIST+=exprtk_simple_example_16 +BUILD_LIST+=exprtk_simple_example_17 all: $(BUILD_LIST) diff --git a/exprtk_simple_example_09.cpp b/exprtk_simple_example_09.cpp index 2ee1a23..58f495f 100644 --- a/exprtk_simple_example_09.cpp +++ b/exprtk_simple_example_09.cpp @@ -44,18 +44,18 @@ void primes() .add( function_t( "is_prime_impl1", - "if (y == 1,true, " - " if (0 == (x % y),false, " - " is_prime_impl1(x,y - 1)))", + " if (y == 1,true, " + " if (0 == (x % y),false, " + " is_prime_impl1(x,y - 1))) ", "x","y")); compositor .add( function_t( "is_prime1", - "if (frac(x) != 0, false, " - " if (x <= 0, false, " - " is_prime_impl1(x,min(x - 1,trunc(sqrt(x)) + 1))))", + " if (frac(x) != 0, false, " + " if (x <= 0, false, " + " is_prime_impl1(x,min(x - 1,trunc(sqrt(x)) + 1)))) ", "x")); //Mode 2 - switch statement based @@ -63,24 +63,24 @@ void primes() .add( function_t( "is_prime_impl2", - "switch " - "{ " - " case y == 1 : true; " - " case (x % y) == 0 : false; " - " default : is_prime_impl2(x,y - 1);" - "} ", + " switch " + " { " + " case y == 1 : true; " + " case (x % y) == 0 : false; " + " default : is_prime_impl2(x,y - 1); " + " } ", "x","y")); compositor .add( function_t( "is_prime2", - "switch " - "{ " - " case x <= 0 : false; " - " case frac(x) != 0 : false; " - " default : is_prime_impl2(x,min(x - 1,trunc(sqrt(x)) + 1));" - "} ", + " switch " + " { " + " case x <= 0 : false; " + " case frac(x) != 0 : false; " + " default : is_prime_impl2(x,min(x - 1,trunc(sqrt(x)) + 1)); " + " } ", "x")); //Mode 3 - switch statement and while-loop based @@ -88,27 +88,27 @@ void primes() .add( function_t( "is_prime_impl3", - "while (y > 0) " - "{ " - " switch " - " { " - " case y == 1 : ~(y := 0,true); " - " case (x % y) == 0 : ~(y := 0,false);" - " default : y := y - 1; " - " } " - "} ", + " while (y > 0) " + " { " + " switch " + " { " + " case y == 1 : ~(y := 0,true); " + " case (x % y) == 0 : ~(y := 0,false); " + " default : y := y - 1; " + " } " + " } ", "x","y")); compositor .add( function_t( "is_prime3", - "switch " - "{ " - " case x <= 0 : false; " - " case frac(x) != 0 : false; " - " default : is_prime_impl3(x,min(x - 1,trunc(sqrt(x)) + 1));" - "} ", + " switch " + " { " + " case x <= 0 : false; " + " case frac(x) != 0 : false; " + " default : is_prime_impl3(x,min(x - 1,trunc(sqrt(x)) + 1)); " + " } ", "x")); std::string expression_str1 = "is_prime1(x)"; diff --git a/exprtk_simple_example_17.cpp b/exprtk_simple_example_17.cpp new file mode 100644 index 0000000..9534bbc --- /dev/null +++ b/exprtk_simple_example_17.cpp @@ -0,0 +1,75 @@ +/* + ************************************************************** + * C++ Mathematical Expression Toolkit Library * + * * + * Simple Example 17 * + * Author: Arash Partow (1999-2016) * + * URL: http://www.partow.net/programming/exprtk/index.html * + * * + * Copyright notice: * + * Free use of the Mathematical Expression Toolkit Library is * + * permitted under the guidelines and in accordance with the * + * most current version of the Common Public License. * + * http://www.opensource.org/licenses/cpl1.0.php * + * * + ************************************************************** +*/ + + +#include +#include +#include +#include + +#include "exprtk.hpp" + + +template +struct rnd_01 : public exprtk::ifunction +{ + rnd_01() : exprtk::ifunction(0) + { ::srand(static_cast(time(NULL))); } + + inline T operator()() + { + // Note: Do not use this in production + return T(::rand() / T(RAND_MAX + 1)); + } +}; + +template +void monte_carlo_pi() +{ + typedef exprtk::symbol_table symbol_table_t; + typedef exprtk::expression expression_t; + typedef exprtk::parser parser_t; + + std::string monte_carlo_pi_program = + " var experiments[5 * 10^7] := [(rnd_01^2 + rnd_01^2) <= 1]; " + " 4 * sum(experiments) / experiments[]; "; + + rnd_01 rnd01; + + symbol_table_t symbol_table; + symbol_table.add_function("rnd_01",rnd01); + + expression_t expression; + expression.register_symbol_table(symbol_table); + + parser_t parser; + parser.compile(monte_carlo_pi_program,expression); + + const T approximate_pi = expression.value(); + + const T real_pi = T(3.141592653589793238462); + + printf("pi ~ %20.17f\terror: %20.17f\n", + approximate_pi, + std::abs(real_pi - approximate_pi)); +} + +int main() +{ + monte_carlo_pi(); + return 0; +} diff --git a/readme.txt b/readme.txt index 291c59d..2ed1891 100644 --- a/readme.txt +++ b/readme.txt @@ -2900,6 +2900,7 @@ files: (18) exprtk_simple_example_14.cpp (19) exprtk_simple_example_15.cpp (20) exprtk_simple_example_16.cpp + (21) exprtk_simple_example_17.cpp ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~