Lines Matching +full:- +full:u
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
39 union IEEEl2bits u; in inc() local
41 u.e = x; in inc()
42 if (++u.bits.manl == 0) { in inc()
43 if (++u.bits.manh == 0) { in inc()
44 u.bits.exp++; in inc()
45 u.bits.manh |= LDBL_NBIT; in inc()
48 return (u.e); in inc()
51 /* Return (x - ulp) for normal positive x. Assumes no underflow. */
55 union IEEEl2bits u; in dec() local
57 u.e = x; in dec()
58 if (u.bits.manl-- == 0) { in dec()
59 if (u.bits.manh-- == LDBL_NBIT) { in dec()
60 u.bits.exp--; in dec()
61 u.bits.manh |= LDBL_NBIT; in dec()
64 return (u.e); in dec()
77 union IEEEl2bits u; in sqrtl() local
82 u.e = x; in sqrtl()
86 /* If x = -Inf, then sqrt(x) = NaN. */ in sqrtl()
87 if (u.bits.exp == LDBL_MAX_EXP * 2 - 1) in sqrtl()
90 /* If x = +-0, then sqrt(x) = +-0. */ in sqrtl()
91 if ((u.bits.manh | u.bits.manl | u.bits.exp) == 0) in sqrtl()
95 if (u.bits.sign) in sqrtl()
96 return ((x - x) / (x - x)); in sqrtl()
100 if (u.bits.exp == 0) { in sqrtl()
102 u.e *= 0x1.0p514; in sqrtl()
103 k = -514; in sqrtl()
108 * u.e is a normal number, so break it into u.e = e*2^n where in sqrtl()
109 * u.e = (2*e)*2^2k for odd n and u.e = (4*e)*2^2k for even n. in sqrtl()
111 if ((u.bits.exp - 0x3ffe) & 1) { /* n is odd. */ in sqrtl()
112 k += u.bits.exp - 0x3fff; /* 2k = n - 1. */ in sqrtl()
113 u.bits.exp = 0x3fff; /* u.e in [1,2). */ in sqrtl()
115 k += u.bits.exp - 0x4000; /* 2k = n - 2. */ in sqrtl()
116 u.bits.exp = 0x4000; /* u.e in [2,4). */ in sqrtl()
121 * Split u.e into a high and low part to achieve additional precision. in sqrtl()
123 xn = sqrt(u.e); /* 53-bit estimate of sqrtl(x). */ in sqrtl()
125 xn = (xn + (u.e / xn)) * 0.5; /* 106-bit estimate. */ in sqrtl()
127 lo = u.e; in sqrtl()
128 u.bits.manl = 0; /* Zero out lower bits. */ in sqrtl()
129 lo = (lo - u.e) / xn; /* Low bits divided by xn. */ in sqrtl()
130 xn = xn + (u.e / xn); /* High portion of estimate. */ in sqrtl()
131 u.e = xn + lo; /* Combine everything. */ in sqrtl()
132 u.bits.exp += (k >> 1) - 1; in sqrtl()
136 fesetround(FE_TOWARDZERO); /* Set to round-toward-zero. */ in sqrtl()
137 xn = x / u.e; /* Chopped quotient (inexact?). */ in sqrtl()
140 if (xn == u.e) { in sqrtl()
142 return (u.e); in sqrtl()
144 /* Round correctly for inputs like x = y**2 - ulp. */ in sqrtl()
145 xn = dec(xn); /* xn = xn - ulp. */ in sqrtl()
151 u.e = inc(u.e); /* u.e = u.e + ulp. */ in sqrtl()
154 u.e = u.e + xn; /* Chopped sum. */ in sqrtl()
156 u.bits.exp--; in sqrtl()
157 return (u.e); in sqrtl()