#include "SDL_internal.h"1/*2* ====================================================3* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.4*5* Developed at SunPro, a Sun Microsystems, Inc. business.6* Permission to use, copy, modify, and distribute this7* software is freely granted, provided that this notice8* is preserved.9* ====================================================10*/1112/* sin(x)13* Return sine function of x.14*15* kernel function:16* __kernel_sin ... sine function on [-pi/4,pi/4]17* __kernel_cos ... cose function on [-pi/4,pi/4]18* __ieee754_rem_pio2 ... argument reduction routine19*20* Method.21* Let S,C and T denote the sin, cos and tan respectively on22* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/223* in [-pi/4 , +pi/4], and let n = k mod 4.24* We have25*26* n sin(x) cos(x) tan(x)27* ----------------------------------------------------------28* 0 S C T29* 1 C -S -1/T30* 2 -S -C T31* 3 -C S -1/T32* ----------------------------------------------------------33*34* Special cases:35* Let trig be any of sin, cos, or tan.36* trig(+-INF) is NaN, with signals;37* trig(NaN) is that NaN;38*39* Accuracy:40* TRIG(x) returns trig(x) nearly rounded41*/4243#include "math_libm.h"44#include "math_private.h"4546double sin(double x)47{48double y[2],z=0.0;49int32_t n, ix;5051/* High word of x. */52GET_HIGH_WORD(ix,x);5354/* |x| ~< pi/4 */55ix &= 0x7fffffff;56if(ix <= 0x3fe921fb) return __kernel_sin(x,z,0);5758/* sin(Inf or NaN) is NaN */59else if (ix>=0x7ff00000) return x-x;6061/* argument reduction needed */62else {63n = __ieee754_rem_pio2(x,y);64switch(n&3) {65case 0: return __kernel_sin(y[0],y[1],1);66case 1: return __kernel_cos(y[0],y[1]);67case 2: return -__kernel_sin(y[0],y[1],1);68default:69return -__kernel_cos(y[0],y[1]);70}71}72}73libm_hidden_def(sin)747576