46{
50
51 const std::string wiener_process_pi_program =
52 " var w[10^4] := [0]; "
53 " "
54 " for (var i := 0; i < w[]; i += 1) "
55 " { "
56 " var x[10^4] := [(rnd_01 < 1 / 2) ? -1 : 1]; "
57 " w[i] := sum(x); "
58 " } "
59 " "
60 " (2 * w[]) / avg(abs(w))^2; ";
61
63
64 symbol_table_t symbol_table;
65 symbol_table.add_function("rnd_01",rnd01);
66
67 expression_t expression;
68 expression.register_symbol_table(symbol_table);
69
70 parser_t parser;
71 parser.compile(wiener_process_pi_program,expression);
72
73 const T approximate_pi = expression.value();
74
75 const T real_pi = T(3.141592653589793238462643383279502);
76
77 printf("pi ~ %20.17f\terror: %20.17f\n",
78 approximate_pi,
79 std::abs(real_pi - approximate_pi));
80}