I've often wondered this myself. As I understand it, the purpose of the sincos function was to call the FSINCOS assembly instruction for x87 FPU. On modern processors however, it is generally acknowledged that calling a well-written math library compiled to use SSE instructions is typically faster (and can be more accurate) than using x87 trig instructions. See this discussion: http://stackoverflow.com/questions/12485190/calling-fsincos-instruction-in-llvm-slower-than-calling-libc-sin-cos-functions
Calling sincos using Isaiah's method seems to be about 9 times slower than calling the sin and cos separately: https://gist.github.com/734dcacde1f107397b3b.git though a lot of this seems to be due to the overhead in creating and destroying the arrays for return values. On Monday, 28 July 2014 13:34:53 UTC+1, Kevin Squire wrote: > > This paper seems relevant, though possibly only for 32-bit: > > > http://hal.archives-ouvertes.fr/docs/00/67/23/27/PDF/Jeannerod-JourdanLu.pdf > > Cheers, > Kevin > > On Monday, July 28, 2014, Stuart Brorson <[email protected] <javascript:>> > wrote: > >> On Sun, 27 Jul 2014, Viral Shah wrote: >> >> Is sincos a standard libm function? >>> >> >> Out of curiosity I looked into sincos since I had never heard of it. >> A quick check shows there's no sincos in fdlibm >> (on netlib). However, a little Googling reveals an old Sun math >> library libsunmath seems to implement it. >> >> I did find a couple of libm variants which implemented sincos. >> However, they simply called sin & cos separately. As Stephan says >> upthread, no performance improvement. >> >> As far as I know, sin & cos are usually computed using mod to fold >> the input x down to the first quadrant, and then using a power series >> (needs only 6 or 8 terms IIRC) to compute the function. Perhaps >> libsunmath computed e.g. cos first, and then did sin = sqrt(1 - >> cos^2)? Taking the sqrt seems non-performant compared to evaluating a >> short power series, but maybe they had a reason? Another thought: sin >> and cos are reflections of each other (over the line x = pi/4) in the >> first quadrant. Perhaps there some other clever way to get sin from >> cos? I couldn't think if any in the short time I spent considering >> it. >> >> Stuart >> >> >> On Sun, 27 Jul 2014, Viral Shah wrote: >> >> Is sincos a standard libm function? >>> >>> Also, I wonder if creating the one entry array is too expensive, and if >>> we >>> should just call sin and cos separately. The vectorized version may be >>> able >>> to benefit from calling sincos directly. >>> >>> -viral >>> >>> On Monday, July 28, 2014 1:02:06 AM UTC+5:30, Isaiah wrote: >>> >>>> >>>> It doesn't appear to be wrapped, but you can call it yourself like this: >>>> >>>> julia> sincos(x) = begin psin = Cdouble[0]; pcos = Cdouble[0]; >>>> ccall(:sincos, Void, (Cdouble, Ptr{Cdouble}, Ptr{Cdouble}), x, psin, >>>> pcos); >>>> (psin[1], pcos[1]); end >>>> sincos (generic function with 1 method) >>>> >>>> julia> sincos(pi) >>>> (1.2246467991473532e-16,-1.0) >>>> >>>> Feel free to open an issue or pull request if you think it should be >>>> exported - might have just been an oversight. >>>> >>>> >>>> On Sun, Jul 27, 2014 at 3:25 PM, Ken B <[email protected]> >>>> wrote: >>>> >>>> Hi, >>>>> >>>>> I want to calculated sine and cosine together of the same angle. I saw >>>>> this function is implemented in openlibm, but is it available in julia >>>>> and >>>>> how? >>>>> >>>>> >>>>> https://github.com/JuliaLang/openlibm/blob/ >>>>> 18f475de56ec7b478b9220a5f28eb9a23cb51d96/src/s_sincos.c >>>>> >>>>> Thanks! >>>>> Ken >>>>> >>>>> >>>> >>>>
