# Why this formula gives approximation of e?

mXparser code:

Function s = new Function("s(n, x) = if( x >= 1, n, s(n+1, x + rUni(0,1) ) )");
Expression e = new Expression("avg( i, 1, 10000, s(0,0) )", s);


Result:

[mXparser-v.4.1.1] 2.7194


Best regards,

## 8 thoughts on “Why this formula gives approximation of e?”

1. Kurt Weber says:

Hi,
I calculate the followig Expression (0.00000000004*0.000000005).calculate() in Java.
The result is Zero. I have tested that the precision of e.calculate is not more than about 1E-14. Is that true or can I have a better precision?What do I wrong? I have another calculator on my phone who calculate up to 1E-60 and more.
Yours

1. Mariusz Gromada says:

Hi,

Thx for your comment.

This is a result of a change that I implemented some time ago to solve the reported problem with sin(pi/2) equals not exactly 1. Current mXparser behavior is that at the end of expression calculation almost integers are rounded to int. Almost integer is is defined based on the epsilon. This will be changed in the new version, pls see the issue.

Also – currently mXparser has built-in ulp rounding to solve double precision representation and cases like 0.1+0.1+0.1 <> 0.3. Here you have options that are already available.
mXparser.disableUlpRoundng()
mXparser.enableUlpRoundng()

After new change you will get additionally
mXparser.disableAlmostIntRounding()
mXparser.enableAlmostIntRounding()

Best regards

1. Kurt Weber says:

Hi Mariusz,
Thanks a lot for your fast answer. I read before about the rounding-Problem, but I dont connect it with epsilon. I am writing a little calculator as an android app with your mxparser and it works very well, but I have still many to do. Can you tell me what epsilon is about? 9.99*10-14?

You made a great job in making the mxparser. Many thanks.
Yours

1. Mariusz Gromada says:

v.4.1.1 at the end of calculate method tuns the following code:

double resultint = Math.round(result);
if ( MathFunctions.abs(result-resultint) <= BinaryRelations.getEpsilon() ) result = resultint; return result; You can change this epsilon by mXparser.setEpsilon(double epsilon) which will execute BinaryRelations.setEpsilon(double epsilon) So, you can use this as a workaround, i.e. setting mXparser.setEpsilon(0) But this will be changed and in v.4.2.0 I will introduce dedicated options. best regards

1. Kurt Weber says:

Thank you very much. This is what I want. Now I can calculate very small numbers.
Youre the best :-))))))

2. Mariusz Gromada says:

The other option you can use is mXparser.disableUlpRounding()

2. Kurt Weber says:

I tried both , but epsilon setting to 1E-99 or higher is the best way. So I can calculate more than 10 decimal numbers ( i.e. in both factors of a multiplication) and the exponential notation always shows a result.
When I use the disable method than the limit of epsilon (1E-14) persists.

Once more many thanks to you.

best regards

1. Mariusz Gromada says:

Ok. Thx. This will be changed in v.4.2

But remember to disable ulp rounding and then set the epsilon to very small number. Ulp rounding is a different story than almost int rounding. ULP stands for Unit in the Last Place. I introduced this to fix double behavior and make it more similar to decimal.

If you like the repo pls give it a star on GitHub 🙂