source: trunk/libs/libmath/s_sin.c @ 630

Last change on this file since 630 was 469, checked in by alain, 6 years ago

1) Introduce the libsemaphore library.
2) Introduce a small libmath library, required by the "fft" application..
3) Introduce the multithreaded "fft" application.
4) Fix a bad synchronisation bug in the Copy-On-Write mechanism.

File size: 1.9 KB
Line 
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
50double 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
Note: See TracBrowser for help on using the repository browser.