That wouldn't be thread safe, which isn't a worry right now, but might be
in the near future.


On Mon, Jul 28, 2014 at 10:02 AM, Simon Kornblith <[email protected]>
wrote:

> 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
>>> >>>>>>>>
>>> >>>>>>>>
>>> >>>>>>>>
>>> >>>>>>>
>>> >>>>>>>
>>> >
>>>
>>

Reply via email to