So the computation always has numerical error.

That is the reason why there is a error range when you set up the event.

If the difference in event checking is less than the error range, it is assume to be the same.

Because your object starts at one end, so the condition is match in the beginning (unless you also add velocity checking condition).

If e=0 , then the bouncing speed is zero. How would you expect the object to move???

For e<1: the velocity will decrease by the same ratio with each collision.

Eventually, it will reach near zero and the event condition will match all the time.

So more code is needed to take care of it.

Physically, the object is stopped when the velocity is smaller than experimental error.

And no one can notice the differences when the moving is less than the resolution of the computer screen resolution.

You should pause the simulation when the object is very close to one of the event position and the velocity is less than some minimum value.

More calculation is useless.