Presumably we could use the same global or let-scoped array rather than allocating a new array on each call.
On Monday, July 28, 2014 11:39:44 AM UTC-4, Simon Byrne wrote: > > Yes, I would agree: as Elliot mentioned, you might get some gain by only > doing the range-reduction once. > > Looking at the source of openlibm/src/s_sincos.c, it seems that's what it > does, as well as calculating z = x*x and w= z*z once... > > Is there a more efficient way to get return reference values than using > arrays? > > > On Monday, 28 July 2014 16:29:05 UTC+1, Stuart Brorson wrote: >> >> Yup, you certainly don't want to use CORDIC. My e-mail is just a >> historical note. >> >> The standard (fdlibm) implementation of sin & cos involves >> summing a polynomial with 6 or 8 coefficients (after folding down to >> the first quadrant). Here's the kernel: >> >> http://www.netlib.org/fdlibm/k_sin.c >> >> This impl seems pretty quick, IMO. I'd wager that >> there's probably not much room for improvement over the existing, >> separate implementations. >> >> Stuart >> >> >> On Mon, 28 Jul 2014, Stefan Karpinski wrote: >> >> > This CORDIC explanation seems quite plausible. However, it seems like >> we >> > probably don't want to use this algorithm, which means that we're not >> at >> > this point able to get any kind of speedup for sincos(x) relative to >> > sin(x), cos(x). >> > >> > >> > On Mon, Jul 28, 2014 at 10:13 AM, Stuart Brorson <[email protected]> >> wrote: >> > >> >> A bell rang in the back of my head as I was on my way to work this >> >> morning. I was thinking about sincos again, and remembered something >> >> about CORDIC algorithms from the distant past. These are add and >> >> shift algorithms used to compute certain trig and other elementary >> >> functions. They were very popular for scientific calculators back >> when >> >> hand-held calculators were new since they are easily implementable in >> >> hardware, and don't require floating point multiply. A couple of >> >> references: >> >> >> >> http://en.wikipedia.org/wiki/CORDIC >> >> http://ww1.microchip.com/downloads/en/AppNotes/01061A.pdf >> >> >> >> It appears that a common CORDIC computation will product sin & cos >> >> together. I'll bet dollars to doughnuts (without actually knowing) >> >> that the x87 assembly instruction mentioned below was doing a CORDIC >> >> computation, and it made sense to return both sin & cos since >> >> they were computed together. >> >> >> >> The paper by Jeannerod & JourdanLu refer to CORDIC methods, but is >> >> apparently an extension, as far as I can tell. >> >> >> >> Stuart >> >> >> >> >> >> >> >> >> >> On Mon, 28 Jul 2014, Simon Byrne wrote: >> >> >> >> 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 >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> >> >>>>>>> >> >>>>>>> >> > >> >
