1 1.1 mrg /* 2 1.1 mrg * ==================================================== 3 1.1 mrg * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 4 1.1 mrg * 5 1.1 mrg * Developed at SunPro, a Sun Microsystems, Inc. business. 6 1.1 mrg * Permission to use, copy, modify, and distribute this 7 1.1 mrg * software is freely granted, provided that this notice 8 1.1 mrg * is preserved. 9 1.1 mrg * ==================================================== 10 1.1 mrg */ 11 1.1 mrg 12 1.1 mrg /* Expansions and modifications for 128-bit long double are 13 1.1 mrg Copyright (C) 2001 Stephen L. Moshier <moshier (at) na-net.ornl.gov> 14 1.1 mrg and are incorporated herein by permission of the author. The author 15 1.1 mrg reserves the right to distribute this material elsewhere under different 16 1.1 mrg copying permissions. These modifications are distributed here under 17 1.1 mrg the following terms: 18 1.1 mrg 19 1.1 mrg This library is free software; you can redistribute it and/or 20 1.1 mrg modify it under the terms of the GNU Lesser General Public 21 1.1 mrg License as published by the Free Software Foundation; either 22 1.1 mrg version 2.1 of the License, or (at your option) any later version. 23 1.1 mrg 24 1.1 mrg This library is distributed in the hope that it will be useful, 25 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 26 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 27 1.1 mrg Lesser General Public License for more details. 28 1.1 mrg 29 1.1 mrg You should have received a copy of the GNU Lesser General Public 30 1.1 mrg License along with this library; if not, see 31 1.1 mrg <http://www.gnu.org/licenses/>. */ 32 1.1 mrg 33 1.1 mrg /* powq(x,y) return x**y 34 1.1 mrg * 35 1.1 mrg * n 36 1.1 mrg * Method: Let x = 2 * (1+f) 37 1.1 mrg * 1. Compute and return log2(x) in two pieces: 38 1.1 mrg * log2(x) = w1 + w2, 39 1.1 mrg * where w1 has 113-53 = 60 bit trailing zeros. 40 1.1 mrg * 2. Perform y*log2(x) = n+y' by simulating muti-precision 41 1.1 mrg * arithmetic, where |y'|<=0.5. 42 1.1 mrg * 3. Return x**y = 2**n*exp(y'*log2) 43 1.1 mrg * 44 1.1 mrg * Special cases: 45 1.1 mrg * 1. (anything) ** 0 is 1 46 1.1 mrg * 2. (anything) ** 1 is itself 47 1.1 mrg * 3. (anything) ** NAN is NAN 48 1.1 mrg * 4. NAN ** (anything except 0) is NAN 49 1.1 mrg * 5. +-(|x| > 1) ** +INF is +INF 50 1.1 mrg * 6. +-(|x| > 1) ** -INF is +0 51 1.1 mrg * 7. +-(|x| < 1) ** +INF is +0 52 1.1 mrg * 8. +-(|x| < 1) ** -INF is +INF 53 1.1 mrg * 9. +-1 ** +-INF is NAN 54 1.1 mrg * 10. +0 ** (+anything except 0, NAN) is +0 55 1.1 mrg * 11. -0 ** (+anything except 0, NAN, odd integer) is +0 56 1.1 mrg * 12. +0 ** (-anything except 0, NAN) is +INF 57 1.1 mrg * 13. -0 ** (-anything except 0, NAN, odd integer) is +INF 58 1.1 mrg * 14. -0 ** (odd integer) = -( +0 ** (odd integer) ) 59 1.1 mrg * 15. +INF ** (+anything except 0,NAN) is +INF 60 1.1 mrg * 16. +INF ** (-anything except 0,NAN) is +0 61 1.1 mrg * 17. -INF ** (anything) = -0 ** (-anything) 62 1.1 mrg * 18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer) 63 1.1 mrg * 19. (-anything except 0 and inf) ** (non-integer) is NAN 64 1.1 mrg * 65 1.1 mrg */ 66 1.1 mrg 67 1.1 mrg #include "quadmath-imp.h" 68 1.1 mrg 69 1.1 mrg static const __float128 bp[] = { 70 1.1 mrg 1, 71 1.1 mrg 1.5Q, 72 1.1 mrg }; 73 1.1 mrg 74 1.1 mrg /* log_2(1.5) */ 75 1.1 mrg static const __float128 dp_h[] = { 76 1.1 mrg 0.0, 77 1.1 mrg 5.8496250072115607565592654282227158546448E-1Q 78 1.1 mrg }; 79 1.1 mrg 80 1.1 mrg /* Low part of log_2(1.5) */ 81 1.1 mrg static const __float128 dp_l[] = { 82 1.1 mrg 0.0, 83 1.1 mrg 1.0579781240112554492329533686862998106046E-16Q 84 1.1 mrg }; 85 1.1 mrg 86 1.1 mrg static const __float128 zero = 0, 87 1.1 mrg one = 1, 88 1.1 mrg two = 2, 89 1.1 mrg two113 = 1.0384593717069655257060992658440192E34Q, 90 1.1 mrg huge = 1.0e3000Q, 91 1.1 mrg tiny = 1.0e-3000Q; 92 1.1 mrg 93 1.1 mrg /* 3/2 log x = 3 z + z^3 + z^3 (z^2 R(z^2)) 94 1.1 mrg z = (x-1)/(x+1) 95 1.1 mrg 1 <= x <= 1.25 96 1.1 mrg Peak relative error 2.3e-37 */ 97 1.1 mrg static const __float128 LN[] = 98 1.1 mrg { 99 1.1 mrg -3.0779177200290054398792536829702930623200E1Q, 100 1.1 mrg 6.5135778082209159921251824580292116201640E1Q, 101 1.1 mrg -4.6312921812152436921591152809994014413540E1Q, 102 1.1 mrg 1.2510208195629420304615674658258363295208E1Q, 103 1.1 mrg -9.9266909031921425609179910128531667336670E-1Q 104 1.1 mrg }; 105 1.1 mrg static const __float128 LD[] = 106 1.1 mrg { 107 1.1 mrg -5.129862866715009066465422805058933131960E1Q, 108 1.1 mrg 1.452015077564081884387441590064272782044E2Q, 109 1.1 mrg -1.524043275549860505277434040464085593165E2Q, 110 1.1 mrg 7.236063513651544224319663428634139768808E1Q, 111 1.1 mrg -1.494198912340228235853027849917095580053E1Q 112 1.1 mrg /* 1.0E0 */ 113 1.1 mrg }; 114 1.1 mrg 115 1.1 mrg /* exp(x) = 1 + x - x / (1 - 2 / (x - x^2 R(x^2))) 116 1.1 mrg 0 <= x <= 0.5 117 1.1 mrg Peak relative error 5.7e-38 */ 118 1.1 mrg static const __float128 PN[] = 119 1.1 mrg { 120 1.1 mrg 5.081801691915377692446852383385968225675E8Q, 121 1.1 mrg 9.360895299872484512023336636427675327355E6Q, 122 1.1 mrg 4.213701282274196030811629773097579432957E4Q, 123 1.1 mrg 5.201006511142748908655720086041570288182E1Q, 124 1.1 mrg 9.088368420359444263703202925095675982530E-3Q, 125 1.1 mrg }; 126 1.1 mrg static const __float128 PD[] = 127 1.1 mrg { 128 1.1 mrg 3.049081015149226615468111430031590411682E9Q, 129 1.1 mrg 1.069833887183886839966085436512368982758E8Q, 130 1.1 mrg 8.259257717868875207333991924545445705394E5Q, 131 1.1 mrg 1.872583833284143212651746812884298360922E3Q, 132 1.1 mrg /* 1.0E0 */ 133 1.1 mrg }; 134 1.1 mrg 135 1.1 mrg static const __float128 136 1.1 mrg /* ln 2 */ 137 1.1 mrg lg2 = 6.9314718055994530941723212145817656807550E-1Q, 138 1.1 mrg lg2_h = 6.9314718055994528622676398299518041312695E-1Q, 139 1.1 mrg lg2_l = 2.3190468138462996154948554638754786504121E-17Q, 140 1.1 mrg ovt = 8.0085662595372944372e-0017Q, 141 1.1 mrg /* 2/(3*log(2)) */ 142 1.1 mrg cp = 9.6179669392597560490661645400126142495110E-1Q, 143 1.1 mrg cp_h = 9.6179669392597555432899980587535537779331E-1Q, 144 1.1 mrg cp_l = 5.0577616648125906047157785230014751039424E-17Q; 145 1.1 mrg 146 1.1 mrg __float128 147 1.1 mrg powq (__float128 x, __float128 y) 148 1.1 mrg { 149 1.1 mrg __float128 z, ax, z_h, z_l, p_h, p_l; 150 1.1 mrg __float128 y1, t1, t2, r, s, sgn, t, u, v, w; 151 1.1 mrg __float128 s2, s_h, s_l, t_h, t_l, ay; 152 1.1 mrg int32_t i, j, k, yisint, n; 153 1.1 mrg uint32_t ix, iy; 154 1.1 mrg int32_t hx, hy; 155 1.1 mrg ieee854_float128 o, p, q; 156 1.1 mrg 157 1.1 mrg p.value = x; 158 1.1 mrg hx = p.words32.w0; 159 1.1 mrg ix = hx & 0x7fffffff; 160 1.1 mrg 161 1.1 mrg q.value = y; 162 1.1 mrg hy = q.words32.w0; 163 1.1 mrg iy = hy & 0x7fffffff; 164 1.1 mrg 165 1.1 mrg 166 1.1 mrg /* y==zero: x**0 = 1 */ 167 1.1 mrg if ((iy | q.words32.w1 | q.words32.w2 | q.words32.w3) == 0 168 1.1 mrg && !issignalingq (x)) 169 1.1 mrg return one; 170 1.1 mrg 171 1.1 mrg /* 1.0**y = 1; -1.0**+-Inf = 1 */ 172 1.1 mrg if (x == one && !issignalingq (y)) 173 1.1 mrg return one; 174 1.1 mrg if (x == -1 && iy == 0x7fff0000 175 1.1 mrg && (q.words32.w1 | q.words32.w2 | q.words32.w3) == 0) 176 1.1 mrg return one; 177 1.1 mrg 178 1.1 mrg /* +-NaN return x+y */ 179 1.1 mrg if ((ix > 0x7fff0000) 180 1.1 mrg || ((ix == 0x7fff0000) 181 1.1 mrg && ((p.words32.w1 | p.words32.w2 | p.words32.w3) != 0)) 182 1.1 mrg || (iy > 0x7fff0000) 183 1.1 mrg || ((iy == 0x7fff0000) 184 1.1 mrg && ((q.words32.w1 | q.words32.w2 | q.words32.w3) != 0))) 185 1.1 mrg return x + y; 186 1.1 mrg 187 1.1 mrg /* determine if y is an odd int when x < 0 188 1.1 mrg * yisint = 0 ... y is not an integer 189 1.1 mrg * yisint = 1 ... y is an odd int 190 1.1 mrg * yisint = 2 ... y is an even int 191 1.1 mrg */ 192 1.1 mrg yisint = 0; 193 1.1 mrg if (hx < 0) 194 1.1 mrg { 195 1.1 mrg if (iy >= 0x40700000) /* 2^113 */ 196 1.1 mrg yisint = 2; /* even integer y */ 197 1.1 mrg else if (iy >= 0x3fff0000) /* 1.0 */ 198 1.1 mrg { 199 1.1 mrg if (floorq (y) == y) 200 1.1 mrg { 201 1.1 mrg z = 0.5 * y; 202 1.1 mrg if (floorq (z) == z) 203 1.1 mrg yisint = 2; 204 1.1 mrg else 205 1.1 mrg yisint = 1; 206 1.1 mrg } 207 1.1 mrg } 208 1.1 mrg } 209 1.1 mrg 210 1.1 mrg /* special value of y */ 211 1.1 mrg if ((q.words32.w1 | q.words32.w2 | q.words32.w3) == 0) 212 1.1 mrg { 213 1.1 mrg if (iy == 0x7fff0000) /* y is +-inf */ 214 1.1 mrg { 215 1.1 mrg if (((ix - 0x3fff0000) | p.words32.w1 | p.words32.w2 | p.words32.w3) 216 1.1 mrg == 0) 217 1.1 mrg return y - y; /* +-1**inf is NaN */ 218 1.1 mrg else if (ix >= 0x3fff0000) /* (|x|>1)**+-inf = inf,0 */ 219 1.1 mrg return (hy >= 0) ? y : zero; 220 1.1 mrg else /* (|x|<1)**-,+inf = inf,0 */ 221 1.1 mrg return (hy < 0) ? -y : zero; 222 1.1 mrg } 223 1.1 mrg if (iy == 0x3fff0000) 224 1.1 mrg { /* y is +-1 */ 225 1.1 mrg if (hy < 0) 226 1.1 mrg return one / x; 227 1.1 mrg else 228 1.1 mrg return x; 229 1.1 mrg } 230 1.1 mrg if (hy == 0x40000000) 231 1.1 mrg return x * x; /* y is 2 */ 232 1.1 mrg if (hy == 0x3ffe0000) 233 1.1 mrg { /* y is 0.5 */ 234 1.1 mrg if (hx >= 0) /* x >= +0 */ 235 1.1 mrg return sqrtq (x); 236 1.1 mrg } 237 1.1 mrg } 238 1.1 mrg 239 1.1 mrg ax = fabsq (x); 240 1.1 mrg /* special value of x */ 241 1.1 mrg if ((p.words32.w1 | p.words32.w2 | p.words32.w3) == 0) 242 1.1 mrg { 243 1.1 mrg if (ix == 0x7fff0000 || ix == 0 || ix == 0x3fff0000) 244 1.1 mrg { 245 1.1 mrg z = ax; /*x is +-0,+-inf,+-1 */ 246 1.1 mrg if (hy < 0) 247 1.1 mrg z = one / z; /* z = (1/|x|) */ 248 1.1 mrg if (hx < 0) 249 1.1 mrg { 250 1.1 mrg if (((ix - 0x3fff0000) | yisint) == 0) 251 1.1 mrg { 252 1.1 mrg z = (z - z) / (z - z); /* (-1)**non-int is NaN */ 253 1.1 mrg } 254 1.1 mrg else if (yisint == 1) 255 1.1 mrg z = -z; /* (x<0)**odd = -(|x|**odd) */ 256 1.1 mrg } 257 1.1 mrg return z; 258 1.1 mrg } 259 1.1 mrg } 260 1.1 mrg 261 1.1 mrg /* (x<0)**(non-int) is NaN */ 262 1.1 mrg if (((((uint32_t) hx >> 31) - 1) | yisint) == 0) 263 1.1 mrg return (x - x) / (x - x); 264 1.1 mrg 265 1.1 mrg /* sgn (sign of result -ve**odd) = -1 else = 1 */ 266 1.1 mrg sgn = one; 267 1.1 mrg if (((((uint32_t) hx >> 31) - 1) | (yisint - 1)) == 0) 268 1.1 mrg sgn = -one; /* (-ve)**(odd int) */ 269 1.1 mrg 270 1.1 mrg /* |y| is huge. 271 1.1 mrg 2^-16495 = 1/2 of smallest representable value. 272 1.1 mrg If (1 - 1/131072)^y underflows, y > 1.4986e9 */ 273 1.1 mrg if (iy > 0x401d654b) 274 1.1 mrg { 275 1.1 mrg /* if (1 - 2^-113)^y underflows, y > 1.1873e38 */ 276 1.1 mrg if (iy > 0x407d654b) 277 1.1 mrg { 278 1.1 mrg if (ix <= 0x3ffeffff) 279 1.1 mrg return (hy < 0) ? huge * huge : tiny * tiny; 280 1.1 mrg if (ix >= 0x3fff0000) 281 1.1 mrg return (hy > 0) ? huge * huge : tiny * tiny; 282 1.1 mrg } 283 1.1 mrg /* over/underflow if x is not close to one */ 284 1.1 mrg if (ix < 0x3ffeffff) 285 1.1 mrg return (hy < 0) ? sgn * huge * huge : sgn * tiny * tiny; 286 1.1 mrg if (ix > 0x3fff0000) 287 1.1 mrg return (hy > 0) ? sgn * huge * huge : sgn * tiny * tiny; 288 1.1 mrg } 289 1.1 mrg 290 1.1 mrg ay = y > 0 ? y : -y; 291 1.1 mrg if (ay < 0x1p-128) 292 1.1 mrg y = y < 0 ? -0x1p-128 : 0x1p-128; 293 1.1 mrg 294 1.1 mrg n = 0; 295 1.1 mrg /* take care subnormal number */ 296 1.1 mrg if (ix < 0x00010000) 297 1.1 mrg { 298 1.1 mrg ax *= two113; 299 1.1 mrg n -= 113; 300 1.1 mrg o.value = ax; 301 1.1 mrg ix = o.words32.w0; 302 1.1 mrg } 303 1.1 mrg n += ((ix) >> 16) - 0x3fff; 304 1.1 mrg j = ix & 0x0000ffff; 305 1.1 mrg /* determine interval */ 306 1.1 mrg ix = j | 0x3fff0000; /* normalize ix */ 307 1.1 mrg if (j <= 0x3988) 308 1.1 mrg k = 0; /* |x|<sqrt(3/2) */ 309 1.1 mrg else if (j < 0xbb67) 310 1.1 mrg k = 1; /* |x|<sqrt(3) */ 311 1.1 mrg else 312 1.1 mrg { 313 1.1 mrg k = 0; 314 1.1 mrg n += 1; 315 1.1 mrg ix -= 0x00010000; 316 1.1 mrg } 317 1.1 mrg 318 1.1 mrg o.value = ax; 319 1.1 mrg o.words32.w0 = ix; 320 1.1 mrg ax = o.value; 321 1.1 mrg 322 1.1 mrg /* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */ 323 1.1 mrg u = ax - bp[k]; /* bp[0]=1.0, bp[1]=1.5 */ 324 1.1 mrg v = one / (ax + bp[k]); 325 1.1 mrg s = u * v; 326 1.1 mrg s_h = s; 327 1.1 mrg 328 1.1 mrg o.value = s_h; 329 1.1 mrg o.words32.w3 = 0; 330 1.1 mrg o.words32.w2 &= 0xf8000000; 331 1.1 mrg s_h = o.value; 332 1.1 mrg /* t_h=ax+bp[k] High */ 333 1.1 mrg t_h = ax + bp[k]; 334 1.1 mrg o.value = t_h; 335 1.1 mrg o.words32.w3 = 0; 336 1.1 mrg o.words32.w2 &= 0xf8000000; 337 1.1 mrg t_h = o.value; 338 1.1 mrg t_l = ax - (t_h - bp[k]); 339 1.1 mrg s_l = v * ((u - s_h * t_h) - s_h * t_l); 340 1.1 mrg /* compute log(ax) */ 341 1.1 mrg s2 = s * s; 342 1.1 mrg u = LN[0] + s2 * (LN[1] + s2 * (LN[2] + s2 * (LN[3] + s2 * LN[4]))); 343 1.1 mrg v = LD[0] + s2 * (LD[1] + s2 * (LD[2] + s2 * (LD[3] + s2 * (LD[4] + s2)))); 344 1.1 mrg r = s2 * s2 * u / v; 345 1.1 mrg r += s_l * (s_h + s); 346 1.1 mrg s2 = s_h * s_h; 347 1.1 mrg t_h = 3.0 + s2 + r; 348 1.1 mrg o.value = t_h; 349 1.1 mrg o.words32.w3 = 0; 350 1.1 mrg o.words32.w2 &= 0xf8000000; 351 1.1 mrg t_h = o.value; 352 1.1 mrg t_l = r - ((t_h - 3.0) - s2); 353 1.1 mrg /* u+v = s*(1+...) */ 354 1.1 mrg u = s_h * t_h; 355 1.1 mrg v = s_l * t_h + t_l * s; 356 1.1 mrg /* 2/(3log2)*(s+...) */ 357 1.1 mrg p_h = u + v; 358 1.1 mrg o.value = p_h; 359 1.1 mrg o.words32.w3 = 0; 360 1.1 mrg o.words32.w2 &= 0xf8000000; 361 1.1 mrg p_h = o.value; 362 1.1 mrg p_l = v - (p_h - u); 363 1.1 mrg z_h = cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ 364 1.1 mrg z_l = cp_l * p_h + p_l * cp + dp_l[k]; 365 1.1 mrg /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ 366 1.1 mrg t = (__float128) n; 367 1.1 mrg t1 = (((z_h + z_l) + dp_h[k]) + t); 368 1.1 mrg o.value = t1; 369 1.1 mrg o.words32.w3 = 0; 370 1.1 mrg o.words32.w2 &= 0xf8000000; 371 1.1 mrg t1 = o.value; 372 1.1 mrg t2 = z_l - (((t1 - t) - dp_h[k]) - z_h); 373 1.1 mrg 374 1.1 mrg /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ 375 1.1 mrg y1 = y; 376 1.1 mrg o.value = y1; 377 1.1 mrg o.words32.w3 = 0; 378 1.1 mrg o.words32.w2 &= 0xf8000000; 379 1.1 mrg y1 = o.value; 380 1.1 mrg p_l = (y - y1) * t1 + y * t2; 381 1.1 mrg p_h = y1 * t1; 382 1.1 mrg z = p_l + p_h; 383 1.1 mrg o.value = z; 384 1.1 mrg j = o.words32.w0; 385 1.1 mrg if (j >= 0x400d0000) /* z >= 16384 */ 386 1.1 mrg { 387 1.1 mrg /* if z > 16384 */ 388 1.1 mrg if (((j - 0x400d0000) | o.words32.w1 | o.words32.w2 | o.words32.w3) != 0) 389 1.1 mrg return sgn * huge * huge; /* overflow */ 390 1.1 mrg else 391 1.1 mrg { 392 1.1 mrg if (p_l + ovt > z - p_h) 393 1.1 mrg return sgn * huge * huge; /* overflow */ 394 1.1 mrg } 395 1.1 mrg } 396 1.1 mrg else if ((j & 0x7fffffff) >= 0x400d01b9) /* z <= -16495 */ 397 1.1 mrg { 398 1.1 mrg /* z < -16495 */ 399 1.1 mrg if (((j - 0xc00d01bc) | o.words32.w1 | o.words32.w2 | o.words32.w3) 400 1.1 mrg != 0) 401 1.1 mrg return sgn * tiny * tiny; /* underflow */ 402 1.1 mrg else 403 1.1 mrg { 404 1.1 mrg if (p_l <= z - p_h) 405 1.1 mrg return sgn * tiny * tiny; /* underflow */ 406 1.1 mrg } 407 1.1 mrg } 408 1.1 mrg /* compute 2**(p_h+p_l) */ 409 1.1 mrg i = j & 0x7fffffff; 410 1.1 mrg k = (i >> 16) - 0x3fff; 411 1.1 mrg n = 0; 412 1.1 mrg if (i > 0x3ffe0000) 413 1.1 mrg { /* if |z| > 0.5, set n = [z+0.5] */ 414 1.1 mrg n = floorq (z + 0.5Q); 415 1.1 mrg t = n; 416 1.1 mrg p_h -= t; 417 1.1 mrg } 418 1.1 mrg t = p_l + p_h; 419 1.1 mrg o.value = t; 420 1.1 mrg o.words32.w3 = 0; 421 1.1 mrg o.words32.w2 &= 0xf8000000; 422 1.1 mrg t = o.value; 423 1.1 mrg u = t * lg2_h; 424 1.1 mrg v = (p_l - (t - p_h)) * lg2 + t * lg2_l; 425 1.1 mrg z = u + v; 426 1.1 mrg w = v - (z - u); 427 1.1 mrg /* exp(z) */ 428 1.1 mrg t = z * z; 429 1.1 mrg u = PN[0] + t * (PN[1] + t * (PN[2] + t * (PN[3] + t * PN[4]))); 430 1.1 mrg v = PD[0] + t * (PD[1] + t * (PD[2] + t * (PD[3] + t))); 431 1.1 mrg t1 = z - t * u / v; 432 1.1 mrg r = (z * t1) / (t1 - two) - (w + z * w); 433 1.1 mrg z = one - (r - z); 434 1.1 mrg o.value = z; 435 1.1 mrg j = o.words32.w0; 436 1.1 mrg j += (n << 16); 437 1.1 mrg if ((j >> 16) <= 0) 438 1.1 mrg { 439 1.1 mrg z = scalbnq (z, n); /* subnormal output */ 440 1.1 mrg __float128 force_underflow = z * z; 441 1.1 mrg math_force_eval (force_underflow); 442 1.1 mrg } 443 1.1 mrg else 444 1.1 mrg { 445 1.1 mrg o.words32.w0 = j; 446 1.1 mrg z = o.value; 447 1.1 mrg } 448 1.1 mrg return sgn * z; 449 1.1 mrg } 450