1 /* s_ilogbf.c -- float version of s_ilogb.c. 2 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. 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 #include <sys/cdefs.h> 17 #if defined(LIBM_SCCS) && !defined(lint) 18 __RCSID("$NetBSD: s_ilogbf.c,v 1.9 2016/08/24 10:03:32 christos Exp $"); 19 #endif 20 21 #include <math.h> 22 #include <fenv.h> 23 #include "math_private.h" 24 25 int 26 ilogbf(float x) 27 { 28 int32_t hx, ix; 29 30 GET_FLOAT_WORD(hx, x); 31 hx &= 0x7fffffff; 32 if (hx < 0x00800000) { 33 if (hx == 0) { 34 feraiseexcept(FE_INVALID); 35 return FP_ILOGB0; /* ilogb(0) = 0x80000001 */ 36 } 37 for (ix = -126, hx <<= 8; hx > 0; hx <<= 1) ix -= 1; 38 return ix; 39 } 40 41 if (hx < 0x7f800000) { 42 return (hx >> 23) - 127; 43 } 44 45 feraiseexcept(FE_INVALID); 46 return isnan(x) ? FP_ILOGBNAN : INT_MAX; 47 } 48