# Modulo Operator %%

kdex kdex at kdex.de
Fri Aug 16 16:09:44 UTC 2019

```Reply inline.

On Friday, August 16, 2019 5:50:40 PM CEST peter miller wrote:
> 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
>
> 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.
Most, if not all, functions on the `Math` prototype can't handle `BigInt`, but
that's a separate issue.

While it would be nice if `Math.mod` supported that, another `Math` proposal
could spec that along with fixes for all the other methods.

For now, it should be good enough if we had a modulo operation at all.
>
> 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
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20190816/581087dd/attachment.sig>
```