From 451a8eb09ae2bb2484ffc76da5854ea9983dd643 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Thu, 11 Feb 2010 21:00:33 +0000 Subject: [PATCH] 2010-02-11 Craig Howland * libm/common/s_ilogb.c: Adjust documentation to reflect new returns (see next items) and that ilogb() and ilogbf() are C99/POSIX. * libm/common/s_ilogb.c (ilogb): Use C99/POSIX FP_ILOGB0 and FP_ILOGBNAN returns for 0 and NAN arguments, respectively, instead of the prior -INT_MAX and INT_MAX. The FP_ILOGBx defines in math.h presently match the prior hard-codes, so no functional change is actually introduced. (Not at this time, nor planned, but the values are permitted to be different, so subsequent edits of math.h could possibly cause a functional change.) * libm/common/sf_ilogb.c (ilogbf): Ditto. --- newlib/ChangeLog | 13 +++++++++++++ newlib/libm/common/s_ilogb.c | 30 ++++++++++++++++++++++-------- newlib/libm/common/sf_ilogb.c | 7 +++++-- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index e870a00ae..8e9df8139 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,16 @@ +2010-02-11 Craig Howland + + * libm/common/s_ilogb.c: Adjust documentation to reflect new returns + (see next items) and that ilogb() and ilogbf() are C99/POSIX. + * libm/common/s_ilogb.c (ilogb): Use C99/POSIX FP_ILOGB0 and + FP_ILOGBNAN returns for 0 and NAN arguments, respectively, instead of + the prior -INT_MAX and INT_MAX. The FP_ILOGBx defines in math.h + presently match the prior hard-codes, so no functional change is + actually introduced. (Not at this time, nor planned, but the values + are permitted to be different, so subsequent edits of math.h could + possibly cause a functional change.) + * libm/common/sf_ilogb.c (ilogbf): Ditto. + 2010-02-09 Daniel Gutson * libc/machine/arm/arm_asm.h (_ISA_THUMB_2): __ARM_ARCH_7EM__ diff --git a/newlib/libm/common/s_ilogb.c b/newlib/libm/common/s_ilogb.c index 00dfef633..67558f748 100644 --- a/newlib/libm/common/s_ilogb.c +++ b/newlib/libm/common/s_ilogb.c @@ -44,13 +44,24 @@ DESCRIPTION RETURNS <> and <> return the power of two used to form the -floating-point argument. If <[val]> is <<0>>, they return <<- -INT_MAX>> (<> is defined in limits.h). If <[val]> is -infinite, or NaN, they return <>. +floating-point argument. +If <[val]> is <<0>>, they return <>. +If <[val]> is infinite, they return <>. +If <[val]> is NaN, they return <>. +(<> and <> are defined in math.h, but in turn are +defined as INT_MIN or INT_MAX from limits.h. The value of FP_ILOGB0 may be +either INT_MIN or -INT_MAX. The value of FP_ILOGBNAN may be either INT_MAX or +INT_MIN.) + +@comment The bugs might not be worth noting, given the mass non-C99/POSIX +@comment behavior of much of the Newlib math library. +@commentBUGS +@commentOn errors, errno is not set per C99 and POSIX requirements even if +@comment(math_errhandling & MATH_ERRNO) is non-zero. PORTABILITY - Neither <> nor <> is required by ANSI C or by - the System V Interface Definition (Issue 2). */ +C99, POSIX +*/ /* ilogb(double x) * return the binary exponent of non-zero x @@ -58,8 +69,8 @@ PORTABILITY * ilogb(inf/NaN) = 0x7fffffff (no signal is raised) */ -#include "fdlibm.h" #include +#include "fdlibm.h" #ifndef _DOUBLE_IS_32BITS @@ -76,7 +87,7 @@ PORTABILITY hx &= 0x7fffffff; if(hx<0x00100000) { if((hx|lx)==0) - return - INT_MAX; /* ilogb(0) = 0x80000001 */ + return FP_ILOGB0; /* ilogb(0) = special case error */ else /* subnormal x */ if(hx==0) { for (ix = -1043; lx>0; lx<<=1) ix -=1; @@ -86,7 +97,10 @@ PORTABILITY return ix; } else if (hx<0x7ff00000) return (hx>>20)-1023; - else return INT_MAX; + #if FP_ILOGBNAN != INT_MAX + else if (hx>0x7ff00000) return FP_ILOGBNAN; /* NAN */ + #endif + else return INT_MAX; /* infinite (or, possibly, NAN) */ } #endif /* _DOUBLE_IS_32BITS */ diff --git a/newlib/libm/common/sf_ilogb.c b/newlib/libm/common/sf_ilogb.c index ec59406e1..28191c2c6 100644 --- a/newlib/libm/common/sf_ilogb.c +++ b/newlib/libm/common/sf_ilogb.c @@ -13,8 +13,8 @@ * ==================================================== */ -#include "fdlibm.h" #include +#include "fdlibm.h" #ifdef __STDC__ int ilogbf(float x) @@ -28,11 +28,14 @@ GET_FLOAT_WORD(hx,x); hx &= 0x7fffffff; if(FLT_UWORD_IS_ZERO(hx)) - return - INT_MAX; /* ilogb(0) = 0x80000001 */ + return FP_ILOGB0; /* ilogb(0) = special case error */ if(FLT_UWORD_IS_SUBNORMAL(hx)) { for (ix = -126,hx<<=8; hx>0; hx<<=1) ix -=1; return ix; } + #if FP_ILOGBNAN != INT_MAX + else if (FLT_UWORD_IS_NAN(hx)) return FP_ILOGBNAN; /* NAN */ + #endif else if (!FLT_UWORD_IS_FINITE(hx)) return INT_MAX; else return (hx>>23)-127; }