Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
3362 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
 
15
 *
16
 * return the remainder of x rem pi/2 in y[0]+y[1]
17
 * use __kernel_rem_pio2()
18
 */
19
20
 
21
22
 
23
24
 
25
 * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
26
 */
27
#ifdef __STDC__
28
static const __int32_t two_over_pi[] = {
29
#else
30
static __int32_t two_over_pi[] = {
31
#endif
32
0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62,
33
0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A,
34
0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129,
35
0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41,
36
0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8,
37
0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF,
38
0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,
39
0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
40
0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
41
0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
42
0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
43
};
44
45
 
46
static const __int32_t npio2_hw[] = {
47
#else
48
static __int32_t npio2_hw[] = {
49
#endif
50
0x3FF921FB, 0x400921FB, 0x4012D97C, 0x401921FB, 0x401F6A7A, 0x4022D97C,
51
0x4025FDBB, 0x402921FB, 0x402C463A, 0x402F6A7A, 0x4031475C, 0x4032D97C,
52
0x40346B9C, 0x4035FDBB, 0x40378FDB, 0x403921FB, 0x403AB41B, 0x403C463A,
53
0x403DD85A, 0x403F6A7A, 0x40407E4C, 0x4041475C, 0x4042106C, 0x4042D97C,
54
0x4043A28C, 0x40446B9C, 0x404534AC, 0x4045FDBB, 0x4046C6CB, 0x40478FDB,
55
0x404858EB, 0x404921FB,
56
};
57
58
 
59
 * invpio2:  53 bits of 2/pi
60
 * pio2_1:   first  33 bit of pi/2
61
 * pio2_1t:  pi/2 - pio2_1
62
 * pio2_2:   second 33 bit of pi/2
63
 * pio2_2t:  pi/2 - (pio2_1+pio2_2)
64
 * pio2_3:   third  33 bit of pi/2
65
 * pio2_3t:  pi/2 - (pio2_1+pio2_2+pio2_3)
66
 */
67
68
 
69
static const double
70
#else
71
static double
72
#endif
73
zero =  0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
74
half =  5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
75
two24 =  1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
76
invpio2 =  6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
77
pio2_1  =  1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
78
pio2_1t =  6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */
79
pio2_2  =  6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */
80
pio2_2t =  2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */
81
pio2_3  =  2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */
82
pio2_3t =  8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */
83
84
 
85
	__int32_t __ieee754_rem_pio2(double x, double *y)
86
#else
87
	__int32_t __ieee754_rem_pio2(x,y)
88
	double x,y[];
89
#endif
90
{
91
	double z = 0.0,w,t,r,fn;
92
	double tx[3];
93
	__int32_t i,j,n,ix,hx;
94
	int e0,nx;
95
	__uint32_t low;
96
97
 
98
	ix = hx&0x7fffffff;
99
	if(ix<=0x3fe921fb)   /* |x| ~<= pi/4 , no need for reduction */
100
	    {y[0] = x; y[1] = 0; return 0;}
101
	if(ix<0x4002d97c) {  /* |x| < 3pi/4, special case with n=+-1 */
102
	    if(hx>0) {
103
		z = x - pio2_1;
104
		if(ix!=0x3ff921fb) { 	/* 33+53 bit pi is good enough */
105
		    y[0] = z - pio2_1t;
106
		    y[1] = (z-y[0])-pio2_1t;
107
		} else {		/* near pi/2, use 33+33+53 bit pi */
108
		    z -= pio2_2;
109
		    y[0] = z - pio2_2t;
110
		    y[1] = (z-y[0])-pio2_2t;
111
		}
112
		return 1;
113
	    } else {	/* negative x */
114
		z = x + pio2_1;
115
		if(ix!=0x3ff921fb) { 	/* 33+53 bit pi is good enough */
116
		    y[0] = z + pio2_1t;
117
		    y[1] = (z-y[0])+pio2_1t;
118
		} else {		/* near pi/2, use 33+33+53 bit pi */
119
		    z += pio2_2;
120
		    y[0] = z + pio2_2t;
121
		    y[1] = (z-y[0])+pio2_2t;
122
		}
123
		return -1;
124
	    }
125
	}
126
	if(ix<=0x413921fb) { /* |x| ~<= 2^19*(pi/2), medium size */
127
	    t  = fabs(x);
128
	    n  = (__int32_t) (t*invpio2+half);
129
	    fn = (double)n;
130
	    r  = t-fn*pio2_1;
131
	    w  = fn*pio2_1t;	/* 1st round good to 85 bit */
132
	    if(n<32&&ix!=npio2_hw[n-1]) {
133
		y[0] = r-w;	/* quick check no cancellation */
134
	    } else {
135
	        __uint32_t high;
136
	        j  = ix>>20;
137
	        y[0] = r-w;
138
		GET_HIGH_WORD(high,y[0]);
139
	        i = j-((high>>20)&0x7ff);
140
	        if(i>16) {  /* 2nd iteration needed, good to 118 */
141
		    t  = r;
142
		    w  = fn*pio2_2;
143
		    r  = t-w;
144
		    w  = fn*pio2_2t-((t-r)-w);
145
		    y[0] = r-w;
146
		    GET_HIGH_WORD(high,y[0]);
147
		    i = j-((high>>20)&0x7ff);
148
		    if(i>49)  {	/* 3rd iteration need, 151 bits acc */
149
		    	t  = r;	/* will cover all possible cases */
150
		    	w  = fn*pio2_3;
151
		    	r  = t-w;
152
		    	w  = fn*pio2_3t-((t-r)-w);
153
		    	y[0] = r-w;
154
		    }
155
		}
156
	    }
157
	    y[1] = (r-y[0])-w;
158
	    if(hx<0) 	{y[0] = -y[0]; y[1] = -y[1]; return -n;}
159
	    else	 return n;
160
	}
161
    /*
162
     * all other (large) arguments
163
     */
164
	if(ix>=0x7ff00000) {		/* x is inf or NaN */
165
	    y[0]=y[1]=x-x; return 0;
166
	}
167
    /* set z = scalbn(|x|,ilogb(x)-23) */
168
	GET_LOW_WORD(low,x);
169
	SET_LOW_WORD(z,low);
170
	e0 	= (int)((ix>>20)-1046);	/* e0 = ilogb(z)-23; */
171
	SET_HIGH_WORD(z, ix - ((__int32_t)e0<<20));
172
	for(i=0;i<2;i++) {
173
		tx[i] = (double)((__int32_t)(z));
174
		z     = (z-tx[i])*two24;
175
	}
176
	tx[2] = z;
177
	nx = 3;
178
	while(tx[nx-1]==zero) nx--;	/* skip zero term */
179
	n  =  __kernel_rem_pio2(tx,y,e0,nx,2,two_over_pi);
180
	if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;}
181
	return n;
182
}
183
184
 
185
>