1 /* 2 * ==================================================== 3 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 4 * 5 * Developed at SunPro, a Sun Microsystems, Inc. business. 6 * Permission to use, copy, modify, and distribute this 7 * software is freely granted, provided that this notice 8 * is preserved. 9 * ==================================================== 10 */ 11 12 #include <float.h> 13 #include <limits.h> 14 #include <math.h> 15 16 #include "fpmath.h" 17 18 int 19 ilogbl(long double x) 20 { 21 union IEEEl2bits u; 22 unsigned long m; 23 int b; 24 25 u.e = x; 26 if (u.bits.exp == 0) { 27 if ((u.bits.manl | u.bits.manh) == 0) 28 return (FP_ILOGB0); 29 /* denormalized */ 30 if (u.bits.manh == 0) { 31 m = 1lu << (LDBL_MANL_SIZE - 1); 32 for (b = LDBL_MANH_SIZE; !(u.bits.manl & m); m >>= 1) 33 b++; 34 } else { 35 m = 1lu << (LDBL_MANH_SIZE - 1); 36 for (b = 0; !(u.bits.manh & m); m >>= 1) 37 b++; 38 } 39 #ifdef LDBL_IMPLICIT_NBIT 40 b++; 41 #endif 42 return (LDBL_MIN_EXP - b - 1); 43 } else if (u.bits.exp < (LDBL_MAX_EXP << 1) - 1) 44 return (u.bits.exp - LDBL_MAX_EXP + 1); 45 else if (u.bits.manl != 0 || u.bits.manh != 0) 46 return (FP_ILOGBNAN); 47 else 48 return (INT_MAX); 49 } 50