# Math.sincos(x)?

Robert Poor rdpoor at gmail.com
Fri Jun 23 10:38:18 UTC 2017

```I previously wrote:

>> most implementations for cos(theta) actually generate sin(theta) as a
"byproduct"

As others several have pointed out, that's not really true.  V8, for
example, uses a (different) Taylor series approximation for sin and cos.
But given the amount of work that goes into reducing theta to a small
interval, it still might make sense.  (See comment about SpiderMonkey
below...)

@Nicolas:

> SpiderMonkey already try to optimize consecutive calls to cos and sin

Very cool!

>  `return { sin: sin(theta), cos: cos(theta) };` will add pressure to the
nursery of the garbage collector.

True -- forgive my ignorance, but is there a way to return multiple values
that does not cause heap allocation?  That was my intention.

Another possible optimization: cache theta with its interval-reduced
equivalent.  If you get a subsequent call with the same theta, you've

On Fri, Jun 23, 2017 at 3:00 AM, Nicolas B. Pierron <
nicolas.b.pierron at mozilla.com> wrote:

> Hi Robert,
>
> On Thu, Jun 22, 2017 at 6:02 PM, Robert Poor <rdpoor at gmail.com> wrote:
> > How often have you seen code that calls Math.sin() and Math.cos() with
> > the same argument, e.g:
> >
> >    x = r * Math.cos(theta);
> >    y = r * Math.sin(theta);
> >
> > ?  This trope is repeated for polar coordinates, complex arithmetic,
> FTTs, etc.
> >
> > However, most implementations for cos(theta) actually generate
> > sin(theta) as a "byproduct" (and vice-versa).  Since trigonometric
> > functions are relatively expensive, and this is a common pattern,
> > wouldn't it make sense to define a function that returns cos(theta)
> > and sin(theta) at the same time?
>
> try to optimize consecutive calls to cos and sin by the sincos
> function when possible.
> I do not know if other optimizing compilers are doing this
> optimization as well, but I would expect that it would be quite easy
>
> http://searchfox.org/mozilla-central/rev/3291398f10dcbe192fb52e74974b17
> 2616c018aa/js/src/jit/Ion.cpp#1310
>
> On Thu, Jun 22, 2017 at 6:02 PM, Robert Poor <rdpoor at gmail.com> wrote:
> >  A polyfill might look like this:
> >
> >    function sincos(theta) {
> >       return { sin: sin(theta), cos: cos(theta) };
> >    }
>
> I would expect all engines to use escape analysis to remove this
> object allocation, when this function is inlined.
>
> Until this code gets inlined, by allocating an object this code will
> add pressure to the nursery of the garbage collector. This will also