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] 
> <javascript:>> 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] 
> <javascript:>> 
> >>>>>>> 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 
> >>>>>>>> 
> >>>>>>>> 
> >>>>>>>> 
> >>>>>>> 
> >>>>>>> 
> > 
>

Reply via email to