Hi,

+1 for _at_least_ having `Math.mod()`

And here's a reason why:

The code `mod = (x,y) => ( ( x % y ) + y ) % y` is not only slow but inaccurate. For example, for `mod( -249825144445569.97, -2022673516699079.8)` gives `-249825144445569.75` (Chrome Version 77.0.3865.35) instead of `-249825144445569.97`

I then switched to `mod = (x,y) => x - Math.floor( x / y ) * y` which gives an accurate answer, and is faster.

But, on a hunch that flow control would be faster than arithmetic, I devised this:

```
mod = (x,y) => {
  const z = x % y;
  return  (y >= 0 && z >= 0 ) || ( y < 0 && z <= 0 ) ? z : y + z;
}
```
And that is _sometimes_ the fastest approach -- assuming I haven't screwed up the maths; cf https://jsbench.me/lrjze7oqv9/2 Although it does seem to depend on the numbers - with the `Math.floor()` approach sometimes coming out faster.

And this all neglects BigInts, Infinites, NaNs, and signed zeroes.

So this isn't a trivial function to polyfill. And, for that reason alone, it should be in the standard. (And if we get it in Math, and convince people to use it, then the pressure for a more ergonomic solution will increase.)

Peter
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to