| 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 this | 
|---|
| 7 |  * software is freely granted, provided that this notice | 
|---|
| 8 |  * is preserved. | 
|---|
| 9 |  * ==================================================== | 
|---|
| 10 |  */ | 
|---|
| 11 |  | 
|---|
| 12 | /* | 
|---|
| 13 |  * Modified for ALMOS-MKH OS at UPMC, France, August 2018. (Alain Greiner) | 
|---|
| 14 |  */ | 
|---|
| 15 |  | 
|---|
| 16 | /* sin(x) | 
|---|
| 17 |  * Return sine function of x. | 
|---|
| 18 |  * | 
|---|
| 19 |  * kernel function: | 
|---|
| 20 |  *      __kernel_sin            ... sine function on [-pi/4,pi/4] | 
|---|
| 21 |  *      __kernel_cos            ... cose function on [-pi/4,pi/4] | 
|---|
| 22 |  *      __ieee754_rem_pio2      ... argument reduction routine | 
|---|
| 23 |  * | 
|---|
| 24 |  * Method. | 
|---|
| 25 |  *      Let S,C and T denote the sin, cos and tan respectively on | 
|---|
| 26 |  *      [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2 | 
|---|
| 27 |  *      in [-pi/4 , +pi/4], and let n = k mod 4. | 
|---|
| 28 |  *      We have | 
|---|
| 29 |  * | 
|---|
| 30 |  *          n        sin(x)      cos(x)        tan(x) | 
|---|
| 31 |  *     ---------------------------------------------------------- | 
|---|
| 32 |  *          0          S           C             T | 
|---|
| 33 |  *          1          C          -S            -1/T | 
|---|
| 34 |  *          2         -S          -C             T | 
|---|
| 35 |  *          3         -C           S            -1/T | 
|---|
| 36 |  *     ---------------------------------------------------------- | 
|---|
| 37 |  * | 
|---|
| 38 |  * Special cases: | 
|---|
| 39 |  *      Let trig be any of sin, cos, or tan. | 
|---|
| 40 |  *      trig(+-INF)  is NaN, with signals; | 
|---|
| 41 |  *      trig(NaN)    is that NaN; | 
|---|
| 42 |  * | 
|---|
| 43 |  * Accuracy: | 
|---|
| 44 |  *      TRIG(x) returns trig(x) nearly rounded | 
|---|
| 45 |  */ | 
|---|
| 46 |  | 
|---|
| 47 | #include "math.h" | 
|---|
| 48 | #include "math_private.h" | 
|---|
| 49 |  | 
|---|
| 50 | double sin(double x) | 
|---|
| 51 | { | 
|---|
| 52 |         double y[2],z=0.0; | 
|---|
| 53 |         int32_t n, ix; | 
|---|
| 54 |  | 
|---|
| 55 |     /* High word of x. */ | 
|---|
| 56 |         GET_HIGH_WORD(ix,x); | 
|---|
| 57 |  | 
|---|
| 58 |     /* |x| ~< pi/4 */ | 
|---|
| 59 |         ix &= 0x7fffffff; | 
|---|
| 60 |         if(ix <= 0x3fe921fb) return __kernel_sin(x,z,0); | 
|---|
| 61 |  | 
|---|
| 62 |     /* sin(Inf or NaN) is NaN */ | 
|---|
| 63 |         else if (ix>=0x7ff00000) return x-x; | 
|---|
| 64 |  | 
|---|
| 65 |     /* argument reduction needed */ | 
|---|
| 66 |         else { | 
|---|
| 67 |             n = __ieee754_rem_pio2(x,y); | 
|---|
| 68 |             switch(n&3) { | 
|---|
| 69 |                 case 0: return  __kernel_sin(y[0],y[1],1); | 
|---|
| 70 |                 case 1: return  __kernel_cos(y[0],y[1]); | 
|---|
| 71 |                 case 2: return -__kernel_sin(y[0],y[1],1); | 
|---|
| 72 |                 default: | 
|---|
| 73 |                         return -__kernel_cos(y[0],y[1]); | 
|---|
| 74 |             } | 
|---|
| 75 |         } | 
|---|
| 76 | } | 
|---|
| 77 |  | 
|---|