88 #define one xxx[0]
89 #define huge xxx[1]
90 #define pio2_hi xxx[2]
91 #define pio2_lo xxx[3]
92 #define pio4_hi xxx[4]
93 #define pS0 xxx[5]
94 #define pS1 xxx[6]
95 #define pS2 xxx[7]
96 #define pS3 xxx[8]
97 #define pS4 xxx[9]
98 #define pS5 xxx[10]
99 #define qS1 xxx[11]
100 #define qS2 xxx[12]
101 #define qS3 xxx[13]
102 #define qS4 xxx[14]
103 /* INDENT ON */
104
105 double
106 asin(double x) {
107 double t, w, p, q, c, r, s;
108 int hx, ix;
109
110 hx = ((int *) &x)[HIWORD];
111 ix = hx & 0x7fffffff;
112 if (ix >= 0x3ff00000) { /* |x| >= 1 */
113 if (((ix - 0x3ff00000) | ((int *) &x)[LOWORD]) == 0)
114 /* asin(1)=+-pi/2 with inexact */
115 return x * pio2_hi + x * pio2_lo;
116 else if (isnan(x))
117 #if defined(FPADD_TRAPS_INCOMPLETE_ON_NAN)
118 return ix >= 0x7ff80000 ? x : (x - x) / (x - x);
119 /* assumes sparc-like QNaN */
120 #else
121 return (x - x) / (x - x); /* asin(|x|>1) is NaN */
122 #endif
123 else
124 return _SVID_libm_err(x, x, 2);
125 }
126 else if (ix < 0x3fe00000) { /* |x| < 0.5 */
127 if (ix < 0x3e400000) { /* if |x| < 2**-27 */
128 if (huge + x > one)
129 return x; /* return x with inexact if
130 * x != 0 */
131 }
132 else
133 t = x * x;
134 p = t * (pS0 + t * (pS1 + t * (pS2 + t * (pS3 +
135 t * (pS4 + t * pS5)))));
136 q = one + t * (qS1 + t * (qS2 + t * (qS3 + t * qS4)));
137 w = p / q;
138 return x + x * w;
139 }
140 /* 1 > |x| >= 0.5 */
141 w = one - fabs(x);
142 t = w * 0.5;
143 p = t * (pS0 + t * (pS1 + t * (pS2 + t * (pS3 + t * (pS4 + t * pS5)))));
144 q = one + t * (qS1 + t * (qS2 + t * (qS3 + t * qS4)));
145 s = sqrt(t);
146 if (ix >= 0x3FEF3333) { /* if |x| > 0.975 */
147 w = p / q;
148 t = pio2_hi - (2.0 * (s + s * w) - pio2_lo);
149 }
150 else {
151 w = s;
152 ((int *) &w)[LOWORD] = 0;
|
88 #define one xxx[0]
89 #define huge xxx[1]
90 #define pio2_hi xxx[2]
91 #define pio2_lo xxx[3]
92 #define pio4_hi xxx[4]
93 #define pS0 xxx[5]
94 #define pS1 xxx[6]
95 #define pS2 xxx[7]
96 #define pS3 xxx[8]
97 #define pS4 xxx[9]
98 #define pS5 xxx[10]
99 #define qS1 xxx[11]
100 #define qS2 xxx[12]
101 #define qS3 xxx[13]
102 #define qS4 xxx[14]
103 /* INDENT ON */
104
105 double
106 asin(double x) {
107 double t, w, p, q, c, r, s;
108 int hx, ix, i;
109
110 hx = ((int *) &x)[HIWORD];
111 ix = hx & 0x7fffffff;
112 if (ix >= 0x3ff00000) { /* |x| >= 1 */
113 if (((ix - 0x3ff00000) | ((int *) &x)[LOWORD]) == 0)
114 /* asin(1)=+-pi/2 with inexact */
115 return x * pio2_hi + x * pio2_lo;
116 else if (isnan(x))
117 #if defined(FPADD_TRAPS_INCOMPLETE_ON_NAN)
118 return ix >= 0x7ff80000 ? x : (x - x) / (x - x);
119 /* assumes sparc-like QNaN */
120 #else
121 return (x - x) / (x - x); /* asin(|x|>1) is NaN */
122 #endif
123 else
124 return _SVID_libm_err(x, x, 2);
125 }
126 else if (ix < 0x3fe00000) { /* |x| < 0.5 */
127 if (ix < 0x3e400000) { /* if |x| < 2**-27 */
128 if ((i = (int) x) == 0)
129 return x; /* return x with inexact if
130 * x != 0 */
131 }
132 t = x * x;
133 p = t * (pS0 + t * (pS1 + t * (pS2 + t * (pS3 +
134 t * (pS4 + t * pS5)))));
135 q = one + t * (qS1 + t * (qS2 + t * (qS3 + t * qS4)));
136 w = p / q;
137 return x + x * w;
138 }
139 /* 1 > |x| >= 0.5 */
140 w = one - fabs(x);
141 t = w * 0.5;
142 p = t * (pS0 + t * (pS1 + t * (pS2 + t * (pS3 + t * (pS4 + t * pS5)))));
143 q = one + t * (qS1 + t * (qS2 + t * (qS3 + t * qS4)));
144 s = sqrt(t);
145 if (ix >= 0x3FEF3333) { /* if |x| > 0.975 */
146 w = p / q;
147 t = pio2_hi - (2.0 * (s + s * w) - pio2_lo);
148 }
149 else {
150 w = s;
151 ((int *) &w)[LOWORD] = 0;
|