Deleted Added
full compact
e_rem_pio2f.c (152535) e_rem_pio2f.c (152596)
1/* e_rem_pio2f.c -- float version of e_rem_pio2.c
2 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3 * Debugged and optimized by Bruce D. Evans.
4 */
5
6/*
7 * ====================================================
8 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
9 *
10 * Developed at SunPro, a Sun Microsystems, Inc. business.
11 * Permission to use, copy, modify, and distribute this
12 * software is freely granted, provided that this notice
13 * is preserved.
14 * ====================================================
15 */
16
17#ifndef lint
1/* e_rem_pio2f.c -- float version of e_rem_pio2.c
2 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3 * Debugged and optimized by Bruce D. Evans.
4 */
5
6/*
7 * ====================================================
8 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
9 *
10 * Developed at SunPro, a Sun Microsystems, Inc. business.
11 * Permission to use, copy, modify, and distribute this
12 * software is freely granted, provided that this notice
13 * is preserved.
14 * ====================================================
15 */
16
17#ifndef lint
18static char rcsid[] = "$FreeBSD: head/lib/msun/src/e_rem_pio2f.c 152535 2005-11-17 02:20:04Z bde $";
18static char rcsid[] = "$FreeBSD: head/lib/msun/src/e_rem_pio2f.c 152596 2005-11-19 02:38:27Z bde $";
19#endif
20
21/* __ieee754_rem_pio2f(x,y)
22 *
23 * return the remainder of x rem pi/2 in y[0]+y[1]
24 * use double precision internally
25 * use __kernel_rem_pio2() for large x
26 */

--- 15 unchanged lines hidden (view full) ---

420xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
430x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
440x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
450x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
46};
47
48/*
49 * invpio2: 53 bits of 2/pi
19#endif
20
21/* __ieee754_rem_pio2f(x,y)
22 *
23 * return the remainder of x rem pi/2 in y[0]+y[1]
24 * use double precision internally
25 * use __kernel_rem_pio2() for large x
26 */

--- 15 unchanged lines hidden (view full) ---

420xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
430x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
440x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
450x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
46};
47
48/*
49 * invpio2: 53 bits of 2/pi
50 * e1pio2: 1*pi/2 rounded to 53 bits
51 * e2pio2: 2*pi/2 rounded to 53 bits
52 * e3pio2: 3*pi/2 rounded to 53 bits
53 * e4pio2: 4*pi/2 rounded to 53 bits
54 * pio2_1: first 33 bit of pi/2
55 * pio2_1t: pi/2 - pio2_1
56 */
57
58static const double
59zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
60half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
61two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
62invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
50 * pio2_1: first 33 bit of pi/2
51 * pio2_1t: pi/2 - pio2_1
52 */
53
54static const double
55zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
56half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
57two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
58invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
63e1pio2 = 1*M_PI_2, /* 0x3FF921FB, 0x54442D18 */
64e2pio2 = 2*M_PI_2, /* 0x400921FB, 0x54442D18 */
65e3pio2 = 3*M_PI_2, /* 0x4012D97C, 0x7F3321D2 */
66e4pio2 = 4*M_PI_2, /* 0x401921FB, 0x54442D18 */
67pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
68pio2_1t = 6.07710050650619224932e-11; /* 0x3DD0B461, 0x1A626331 */
69
70 int32_t __ieee754_rem_pio2f(float x, float *y)
71{
72 double z,w,t,r,fn;
73 double tx[3];
74 int32_t e0,i,nx,n,ix,hx;
75
76 GET_FLOAT_WORD(hx,x);
77 ix = hx&0x7fffffff;
59pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
60pio2_1t = 6.07710050650619224932e-11; /* 0x3DD0B461, 0x1A626331 */
61
62 int32_t __ieee754_rem_pio2f(float x, float *y)
63{
64 double z,w,t,r,fn;
65 double tx[3];
66 int32_t e0,i,nx,n,ix,hx;
67
68 GET_FLOAT_WORD(hx,x);
69 ix = hx&0x7fffffff;
78 if(ix<=0x3f490fda) /* |x| ~<= pi/4, reduction is null */
79 {y[0] = x; y[1] = 0; return 0;}
80 /* 53 bit pi is good enough for special cases */
81 if(ix<=0x407b53d1) { /* |x| ~<= 5*pi/4 */
82 if(ix<=0x4016cbe3) { /* |x| ~<= 3*pi/4 */
83 if(hx>0) {
84 z = x - e1pio2;
85 n = 1;
86 } else {
87 z = x + e1pio2;
88 n = 3;
89 }
90 y[0] = z;
91 y[1] = z - y[0];
92 return n;
93 } else {
94 if(hx>0)
95 z = x - e2pio2;
96 else
97 z = x + e2pio2;
98 y[0] = z;
99 y[1] = z - y[0];
100 return 2;
101 }
102 }
103 if(ix<=0x40e231d5) { /* |x| ~<= 9*pi/4*/
104 if(ix<=0x40afeddf) { /* |x| ~<= 7*pi/4 */
105 if(hx>0) {
106 z = x - e3pio2;
107 n = 3;
108 } else {
109 z = x + e3pio2;
110 n = 1;
111 }
112 y[0] = z;
113 y[1] = z - y[0];
114 return n;
115 } else {
116 if(hx>0)
117 z = x - e4pio2;
118 else
119 z = x + e4pio2;
120 y[0] = z;
121 y[1] = z - y[0];
122 return 0;
123 }
124 }
125 /* 33+53 bit pi is good enough for medium size */
126 if(ix<=0x49490f80) { /* |x| ~<= 2^19*(pi/2), medium size */
127 t = fabsf(x);
128 n = (int32_t) (t*invpio2+half);
129 fn = (double)n;
130 r = t-fn*pio2_1;
131 w = fn*pio2_1t;
132 y[0] = r-w;

--- 29 unchanged lines hidden ---
70 /* 33+53 bit pi is good enough for medium size */
71 if(ix<=0x49490f80) { /* |x| ~<= 2^19*(pi/2), medium size */
72 t = fabsf(x);
73 n = (int32_t) (t*invpio2+half);
74 fn = (double)n;
75 r = t-fn*pio2_1;
76 w = fn*pio2_1t;
77 y[0] = r-w;

--- 29 unchanged lines hidden ---