1*05a0b428SJohn Marino /* $OpenBSD: s_ilogbl.c,v 1.1 2008/12/09 20:00:35 martynas Exp $ */ 2*05a0b428SJohn Marino /* 3*05a0b428SJohn Marino * From: @(#)s_ilogb.c 5.1 93/09/24 4*05a0b428SJohn Marino * ==================================================== 5*05a0b428SJohn Marino * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 6*05a0b428SJohn Marino * 7*05a0b428SJohn Marino * Developed at SunPro, a Sun Microsystems, Inc. business. 8*05a0b428SJohn Marino * Permission to use, copy, modify, and distribute this 9*05a0b428SJohn Marino * software is freely granted, provided that this notice 10*05a0b428SJohn Marino * is preserved. 11*05a0b428SJohn Marino * ==================================================== 12*05a0b428SJohn Marino */ 13*05a0b428SJohn Marino 14*05a0b428SJohn Marino #include <sys/types.h> 15*05a0b428SJohn Marino #include <machine/ieee.h> 16*05a0b428SJohn Marino #include <float.h> 17*05a0b428SJohn Marino #include <limits.h> 18*05a0b428SJohn Marino #include <math.h> 19*05a0b428SJohn Marino 20*05a0b428SJohn Marino int ilogbl(long double x)21*05a0b428SJohn Marinoilogbl(long double x) 22*05a0b428SJohn Marino { 23*05a0b428SJohn Marino struct ieee_ext *p = (struct ieee_ext *)&x; 24*05a0b428SJohn Marino unsigned long m; 25*05a0b428SJohn Marino int b; 26*05a0b428SJohn Marino 27*05a0b428SJohn Marino if (p->ext_exp == 0) { 28*05a0b428SJohn Marino if ((p->ext_fracl 29*05a0b428SJohn Marino #ifdef EXT_FRACLMBITS 30*05a0b428SJohn Marino | p->ext_fraclm 31*05a0b428SJohn Marino #endif /* EXT_FRACLMBITS */ 32*05a0b428SJohn Marino #ifdef EXT_FRACHMBITS 33*05a0b428SJohn Marino | p->ext_frachm 34*05a0b428SJohn Marino #endif /* EXT_FRACHMBITS */ 35*05a0b428SJohn Marino | p->ext_frach) == 0) 36*05a0b428SJohn Marino return (FP_ILOGB0); 37*05a0b428SJohn Marino /* denormalized */ 38*05a0b428SJohn Marino if (p->ext_frach == 0 39*05a0b428SJohn Marino #ifdef EXT_FRACHMBITS 40*05a0b428SJohn Marino && p->ext_frachm == 0 41*05a0b428SJohn Marino #endif 42*05a0b428SJohn Marino ) { 43*05a0b428SJohn Marino m = 1lu << (EXT_FRACLBITS - 1); 44*05a0b428SJohn Marino for (b = EXT_FRACHBITS; !(p->ext_fracl & m); m >>= 1) 45*05a0b428SJohn Marino b++; 46*05a0b428SJohn Marino #if defined(EXT_FRACHMBITS) && defined(EXT_FRACLMBITS) 47*05a0b428SJohn Marino m = 1lu << (EXT_FRACLMBITS - 1); 48*05a0b428SJohn Marino for (b += EXT_FRACHMBITS; !(p->ext_fraclm & m); m >>= 1) 49*05a0b428SJohn Marino b++; 50*05a0b428SJohn Marino #endif /* defined(EXT_FRACHMBITS) && defined(EXT_FRACLMBITS) */ 51*05a0b428SJohn Marino } else { 52*05a0b428SJohn Marino m = 1lu << (EXT_FRACHBITS - 1); 53*05a0b428SJohn Marino for (b = 0; !(p->ext_frach & m); m >>= 1) 54*05a0b428SJohn Marino b++; 55*05a0b428SJohn Marino #ifdef EXT_FRACHMBITS 56*05a0b428SJohn Marino m = 1lu << (EXT_FRACHMBITS - 1); 57*05a0b428SJohn Marino for (; !(p->ext_frachm & m); m >>= 1) 58*05a0b428SJohn Marino b++; 59*05a0b428SJohn Marino #endif /* EXT_FRACHMBITS */ 60*05a0b428SJohn Marino } 61*05a0b428SJohn Marino #ifdef EXT_IMPLICIT_NBIT 62*05a0b428SJohn Marino b++; 63*05a0b428SJohn Marino #endif 64*05a0b428SJohn Marino return (LDBL_MIN_EXP - b - 1); 65*05a0b428SJohn Marino } else if (p->ext_exp < (LDBL_MAX_EXP << 1) - 1) 66*05a0b428SJohn Marino return (p->ext_exp - LDBL_MAX_EXP + 1); 67*05a0b428SJohn Marino else if (p->ext_fracl != 0 68*05a0b428SJohn Marino #ifdef EXT_FRACLMBITS 69*05a0b428SJohn Marino || p->ext_fraclm != 0 70*05a0b428SJohn Marino #endif /* EXT_FRACLMBITS */ 71*05a0b428SJohn Marino #ifdef EXT_FRACHMBITS 72*05a0b428SJohn Marino || p->ext_frachm != 0 73*05a0b428SJohn Marino #endif /* EXT_FRACHMBITS */ 74*05a0b428SJohn Marino || p->ext_frach != 0) 75*05a0b428SJohn Marino return (FP_ILOGBNAN); 76*05a0b428SJohn Marino else 77*05a0b428SJohn Marino return (INT_MAX); 78*05a0b428SJohn Marino } 79