diff options
Diffstat (limited to 'libquadmath/math/frexpq.c')
-rw-r--r-- | libquadmath/math/frexpq.c | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/libquadmath/math/frexpq.c b/libquadmath/math/frexpq.c index 2bd77829bf2..2c381e590df 100644 --- a/libquadmath/math/frexpq.c +++ b/libquadmath/math/frexpq.c @@ -1,4 +1,4 @@ -/* frexpq.c -- __float128 version of s_frexp.c. +/* s_frexpl.c -- long double version of s_frexp.c. * Conversion to IEEE quad long double by Jakub Jelinek, jj@ultra.linux.cz. */ @@ -13,10 +13,14 @@ * ==================================================== */ +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = "$NetBSD: $"; +#endif + /* * for non-zero x * x = frexpq(arg,&exp); - * return a __float128 fp quantity x such that 0.5 <= |x| <1.0 + * return a long double fp quantity x such that 0.5 <= |x| <1.0 * and the corresponding binary exponent "exp". That is * arg = x*2^exp. * If arg is inf, 0.0, or NaN, then frexpq(arg,&exp) returns arg @@ -28,22 +32,21 @@ static const __float128 two114 = 2.0769187434139310514121985316880384E+34Q; /* 0x4071000000000000, 0 */ -__float128 -frexpq (__float128 x, int *eptr) +__float128 frexpq(__float128 x, int *eptr) { - uint64_t hx, lx, ix; - GET_FLT128_WORDS64(hx,lx,x); - ix = 0x7fffffffffffffffULL&hx; - *eptr = 0; - if(ix>=0x7fff000000000000ULL||((ix|lx)==0)) return x + x;/* 0,inf,nan */ - if (ix<0x0001000000000000ULL) { /* subnormal */ - x *= two114; - GET_FLT128_MSW64(hx,x); - ix = hx&0x7fffffffffffffffULL; - *eptr = -114; - } - *eptr += (ix>>48)-16382; - hx = (hx&0x8000ffffffffffffULL) | 0x3ffe000000000000ULL; - SET_FLT128_MSW64(x,hx); - return x; + uint64_t hx, lx, ix; + GET_FLT128_WORDS64(hx,lx,x); + ix = 0x7fffffffffffffffULL&hx; + *eptr = 0; + if(ix>=0x7fff000000000000ULL||((ix|lx)==0)) return x + x;/* 0,inf,nan */ + if (ix<0x0001000000000000ULL) { /* subnormal */ + x *= two114; + GET_FLT128_MSW64(hx,x); + ix = hx&0x7fffffffffffffffULL; + *eptr = -114; + } + *eptr += (ix>>48)-16382; + hx = (hx&0x8000ffffffffffffULL) | 0x3ffe000000000000ULL; + SET_FLT128_MSW64(x,hx); + return x; } |