1/* s_logbl.c -- long double version of s_logb.c. 2 * Conversion to IEEE quad long double by Jakub Jelinek, jj@ultra.linux.cz. 3 */ 4 5/* 6 * ==================================================== 7 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 8 * 9 * Developed at SunPro, a Sun Microsystems, Inc. business. 10 * Permission to use, copy, modify, and distribute this 11 * software is freely granted, provided that this notice 12 * is preserved. 13 * ==================================================== 14 */ 15 16#if defined(LIBM_SCCS) && !defined(lint) 17static char rcsid[] = "NetBSD: "; 18#endif 19 20/* 21 * long double logbq(x) 22 * IEEE 754 logb. Included to pass IEEE test suite. Not recommend. 23 * Use ilogb instead. 24 */ 25 26#include "quadmath-imp.h" 27 28__float128 29logbq (__float128 x) 30{ 31 int64_t lx, hx, ex; 32 33 GET_FLT128_WORDS64 (hx, lx, x); 34 hx &= 0x7fffffffffffffffLL; /* high |x| */ 35 if ((hx | lx) == 0) 36 return -1.0 / fabsq (x); 37 if (hx >= 0x7fff000000000000LL) 38 return x * x; 39 if ((ex = hx >> 48) == 0) /* IEEE 754 logb */ 40 { 41 /* POSIX specifies that denormal number is treated as 42 though it were normalized. */ 43 int ma; 44 if (hx == 0) 45 ma = __builtin_clzll (lx) + 64; 46 else 47 ma = __builtin_clzll (hx); 48 ex -= ma - 16; 49 } 50 return (__float128) (ex - 16383); 51} 52