annotate packages/language/c/libm/current/src/double/portable-api/s_sin.c @ 208:e0c0827131d1 ecos

Merge from eCos master repository on 2002-05-20-20:11:54-BST
author jlarmour
date Mon, 20 May 2002 22:19:26 +0000
parents bf00f99aec69
children d2c90368aeef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1 //===========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
3 // s_sin.c
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
5 // Part of the standard mathematical function library
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
6 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //===========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
12 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
14 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
16 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
20 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
21 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
22 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
25 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
26 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
27 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
28 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
29 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
30 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
31 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
32 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
33 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
34 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
35 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
37 // at http://sources.redhat.com/ecos/ecos-license
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
38 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
39 //####ECOSGPLCOPYRIGHTEND####
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
40 //===========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
41 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
42 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
43 // Author(s): jlarmour
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
44 // Contributors: jlarmour
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45 // Date: 1998-02-13
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
46 // Purpose:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47 // Description:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 // Usage:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 //####DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52 //===========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54 // CONFIGURATION
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 #include <pkgconf/libm.h> // Configuration header
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58 // Include the Math library?
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 #ifdef CYGPKG_LIBM
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61 // Derived from code with the following copyright
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64 /* @(#)s_sin.c 1.3 95/01/18 */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65 /*
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 * ====================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69 * Developed at SunSoft, a Sun Microsystems, Inc. business.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
70 * Permission to use, copy, modify, and distribute this
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
71 * software is freely granted, provided that this notice
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72 * is preserved.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73 * ====================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76 /* sin(x)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77 * Return sine function of x.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79 * kernel function:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 * __kernel_sin ... sine function on [-pi/4,pi/4]
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 * __kernel_cos ... cose function on [-pi/4,pi/4]
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82 * __ieee754_rem_pio2 ... argument reduction routine
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 * Method.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85 * Let S,C and T denote the sin, cos and tan respectively on
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
86 * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87 * in [-pi/4 , +pi/4], and let n = k mod 4.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 * We have
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90 * n sin(x) cos(x) tan(x)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91 * ----------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
92 * 0 S C T
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
93 * 1 C -S -1/T
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94 * 2 -S -C T
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95 * 3 -C S -1/T
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
96 * ----------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
97 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98 * Special cases:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99 * Let trig be any of sin, cos, or tan.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100 * trig(+-INF) is NaN, with signals;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101 * trig(NaN) is that NaN;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
102 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
103 * Accuracy:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104 * TRIG(x) returns trig(x) nearly rounded
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
105 */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
106
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
107 #include "mathincl/fdlibm.h"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
108
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
109 double sin(double x)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111 double y[2],z=0.0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
112 int n, ix;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
113
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114 /* High word of x. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115 ix = CYG_LIBM_HI(x);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
116
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 /* |x| ~< pi/4 */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 ix &= 0x7fffffff;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119 if(ix <= 0x3fe921fb) return __kernel_sin(x,z,0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 /* sin(Inf or NaN) is NaN */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122 else if (ix>=0x7ff00000) return x-x;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124 /* argument reduction needed */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125 else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
126 n = __ieee754_rem_pio2(x,y);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
127 switch(n&3) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
128 case 0: return __kernel_sin(y[0],y[1],1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
129 case 1: return __kernel_cos(y[0],y[1]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130 case 2: return -__kernel_sin(y[0],y[1],1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
131 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132 return -__kernel_cos(y[0],y[1]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137 #endif // ifdef CYGPKG_LIBM
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139 // EOF s_sin.c