diff options
| author | cvs2svn <cvs2svn@FreeBSD.org> | 2004-10-24 09:23:08 +0000 |
|---|---|---|
| committer | cvs2svn <cvs2svn@FreeBSD.org> | 2004-10-24 09:23:08 +0000 |
| commit | f144173128d38d0fe0392e7df830ecf2b1d7ba5b (patch) | |
| tree | a3916fe75f119635e64cc23a6b8a85d452e967ec /lib/msun/src | |
| parent | dfa942f7d11acad60276f757391262fd5922c621 (diff) | |
Notes
Diffstat (limited to 'lib/msun/src')
| -rw-r--r-- | lib/msun/src/s_ilogbl.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/msun/src/s_ilogbl.c b/lib/msun/src/s_ilogbl.c new file mode 100644 index 000000000000..a6a4708562db --- /dev/null +++ b/lib/msun/src/s_ilogbl.c @@ -0,0 +1,54 @@ +/* + * From: @(#)s_ilogb.c 5.1 93/09/24 + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +#ifndef lint +static char rcsid[] = "$FreeBSD$"; +#endif + +#include <float.h> +#include <limits.h> +#include <math.h> + +#include "fpmath.h" + +int +ilogbl(long double x) +{ + union IEEEl2bits u; + unsigned long m; + int b; + + u.e = x; + if (u.bits.exp == 0) { + if ((u.bits.manl | u.bits.manh) == 0) + return (FP_ILOGB0); + /* denormalized */ + if (u.bits.manh == 0) { + m = 1lu << (LDBL_MANL_SIZE - 1); + for (b = LDBL_MANH_SIZE; !(u.bits.manl & m); m >>= 1) + b++; + } else { + m = 1lu << (LDBL_MANH_SIZE - 1); + for (b = 0; !(u.bits.manh & m); m >>= 1) + b++; + } +#ifdef LDBL_IMPLICIT_NBIT + b++; +#endif + return (LDBL_MIN_EXP - b - 1); + } else if (u.bits.exp < (LDBL_MAX_EXP << 1) - 1) + return (u.bits.exp - LDBL_MAX_EXP + 1); + else if (u.bits.manl != 0 || u.bits.manh != 0) + return (FP_ILOGBNAN); + else + return (INT_MAX); +} |
