OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libquadmath/] [math/] [sinq.c] - Blame information for rev 801

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 740 jeremybenn
/* s_sinl.c -- long double version of s_sin.c.
2
 * Conversion to long double by Jakub Jelinek, jj@ultra.linux.cz.
3
 */
4
 
5
/*
6
 * ====================================================
7
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8
 *
9
 * Developed at SunPro, a Sun Microsystems, Inc. business.
10
 * Permission to use, copy, modify, and distribute this
11
 * software is freely granted, provided that this notice
12
 * is preserved.
13
 * ====================================================
14
 */
15
 
16
/* sinl(x)
17
 * Return sine function of x.
18
 *
19
 * kernel function:
20
 *      __kernel_sinl           ... sine function on [-pi/4,pi/4]
21
 *      __kernel_cosl           ... cose function on [-pi/4,pi/4]
22
 *      __ieee754_rem_pio2l     ... 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 "quadmath-imp.h"
48
 
49
__float128
50
sinq (__float128 x)
51
{
52
        __float128 y[2],z=0.0Q;
53
        int64_t n, ix;
54
 
55
    /* High word of x. */
56
        GET_FLT128_MSW64(ix,x);
57
 
58
    /* |x| ~< pi/4 */
59
        ix &= 0x7fffffffffffffffLL;
60
        if(ix <= 0x3ffe921fb54442d1LL)
61
          return __quadmath_kernel_sinq(x,z,0);
62
 
63
    /* sin(Inf or NaN) is NaN */
64
        else if (ix>=0x7fff000000000000LL) {
65
            if (ix == 0x7fff000000000000LL) {
66
                GET_FLT128_LSW64(n,x);
67
            }
68
            return x-x;
69
        }
70
 
71
    /* argument reduction needed */
72
        else {
73
            n = __quadmath_rem_pio2q(x,y);
74
            switch(n&3) {
75
                case 0: return  __quadmath_kernel_sinq(y[0],y[1],1);
76
                case 1: return  __quadmath_kernel_cosq(y[0],y[1]);
77
                case 2: return -__quadmath_kernel_sinq(y[0],y[1],1);
78
                default:
79
                        return -__quadmath_kernel_cosq(y[0],y[1]);
80
            }
81
        }
82
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.