1b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project
2b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/* @(#)s_cos.c 1.3 95/01/18 */
3b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/*
4b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * ====================================================
5b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *
7b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Developed at SunSoft, a Sun Microsystems, Inc. business.
8b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Permission to use, copy, modify, and distribute this
9b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * software is freely granted, provided that this notice
10b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * is preserved.
11b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * ====================================================
12b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project */
13b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project
14b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/* ieee_cos(x)
15b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Return cosine function of x.
16b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *
17b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * kernel function:
18b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *	__kernel_sin		... sine function on [-pi/4,pi/4]
19b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *	__kernel_cos		... cosine function on [-pi/4,pi/4]
20b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *	__ieee754_rem_pio2	... argument reduction routine
21b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *
22b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Method.
23b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *      Let S,C and T denote the sin, cos and tan respectively on
24b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *	[-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
25b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *	in [-pi/4 , +pi/4], and let n = k mod 4.
26b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *	We have
27b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *
28b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *          n        ieee_sin(x)      ieee_cos(x)        ieee_tan(x)
29b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *     ----------------------------------------------------------
30b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *	    0	       S	   C		 T
31b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *	    1	       C	  -S		-1/T
32b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *	    2	      -S	  -C		 T
33b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *	    3	      -C	   S		-1/T
34b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *     ----------------------------------------------------------
35b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *
36b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Special cases:
37b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *      Let trig be any of sin, cos, or tan.
38b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *      trig(+-INF)  is NaN, with signals;
39b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *      trig(NaN)    is that NaN;
40b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *
41b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Accuracy:
42b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *	TRIG(x) returns trig(x) nearly rounded
43b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project */
44b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project
45b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#include "fdlibm.h"
46b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project
47b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#ifdef __STDC__
48b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	double ieee_cos(double x)
49b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#else
50b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	double ieee_cos(x)
51b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	double x;
52b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#endif
53b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project{
54b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	double y[2],z=0.0;
55b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	int n, ix;
56b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project
57b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project    /* High word of x. */
58b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	ix = __HI(x);
59b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project
60b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project    /* |x| ~< pi/4 */
61b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	ix &= 0x7fffffff;
62b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	if(ix <= 0x3fe921fb) return __kernel_cos(x,z);
63b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project
64b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project    /* ieee_cos(Inf or NaN) is NaN */
65b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	else if (ix>=0x7ff00000) return x-x;
66b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project
67b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project    /* argument reduction needed */
68b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	else {
69b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	    n = __ieee754_rem_pio2(x,y);
70b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	    switch(n&3) {
71b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project		case 0: return  __kernel_cos(y[0],y[1]);
72b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project		case 1: return -__kernel_sin(y[0],y[1],1);
73b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project		case 2: return -__kernel_cos(y[0],y[1]);
74b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project		default:
75b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project		        return  __kernel_sin(y[0],y[1],1);
76b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	    }
77b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	}
78b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project}
79