11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* @(#)s_sin.c 5.1 93/09/24 */
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ====================================================
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Developed at SunPro, a Sun Microsystems, Inc. business.
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * software is freely granted, provided that this notice
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * is preserved.
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ====================================================
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char rcsid[] = "$FreeBSD: src/lib/msun/src/s_sin.c,v 1.10 2005/10/24 14:08:36 bde Exp $";
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* sin(x)
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return sine function of x.
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * kernel function:
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	__kernel_sin		... sine function on [-pi/4,pi/4]
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	__kernel_cos		... cose function on [-pi/4,pi/4]
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	__ieee754_rem_pio2	... argument reduction routine
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Method.
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *      Let S,C and T denote the sin, cos and tan respectively on
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	[-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	in [-pi/4 , +pi/4], and let n = k mod 4.
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	We have
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *          n        sin(x)      cos(x)        tan(x)
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *     ----------------------------------------------------------
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	    0	       S	   C		 T
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	    1	       C	  -S		-1/T
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	    2	      -S	  -C		 T
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	    3	      -C	   S		-1/T
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *     ----------------------------------------------------------
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Special cases:
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *      Let trig be any of sin, cos, or tan.
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *      trig(+-INF)  is NaN, with signals;
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *      trig(NaN)    is that NaN;
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Accuracy:
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	TRIG(x) returns trig(x) nearly rounded
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math.h"
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math_private.h"
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdouble
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsin(double x)
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	double y[2],z=0.0;
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int32_t n, ix;
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    /* High word of x. */
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	GET_HIGH_WORD(ix,x);
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    /* |x| ~< pi/4 */
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	ix &= 0x7fffffff;
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if(ix <= 0x3fe921fb) {
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    if(ix<0x3e400000)			/* |x| < 2**-27 */
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	       {if((int)x==0) return x;}	/* generate inexact */
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    return __kernel_sin(x,z,0);
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    /* sin(Inf or NaN) is NaN */
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	else if (ix>=0x7ff00000) return x-x;
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    /* argument reduction needed */
721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	else {
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    n = __ieee754_rem_pio2(x,y);
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    switch(n&3) {
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		case 0: return  __kernel_sin(y[0],y[1],1);
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		case 1: return  __kernel_cos(y[0],y[1]);
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		case 2: return -__kernel_sin(y[0],y[1],1);
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		default:
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return -__kernel_cos(y[0],y[1]);
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
83