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