Subversion Repositories Kolibri OS

Rev

Rev 4872 | Go to most recent revision | Details | Last modification | View Log | RSS feed

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