Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2010-02-12 00:00:33 +0300
committerJeff Johnston <jjohnstn@redhat.com>2010-02-12 00:00:33 +0300
commit451a8eb09ae2bb2484ffc76da5854ea9983dd643 (patch)
tree3e85c785115ddb0725f3dce2467676098106d3de /newlib/libm
parent9bb1d645b3c8b708334f032da2764908bfcfe58c (diff)
2010-02-11 Craig Howland <howland@LGSInnovations.com>
* 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.
Diffstat (limited to 'newlib/libm')
-rw-r--r--newlib/libm/common/s_ilogb.c30
-rw-r--r--newlib/libm/common/sf_ilogb.c7
2 files changed, 27 insertions, 10 deletions
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
<<ilogb>> and <<ilogbf>> return the power of two used to form the
-floating-point argument. If <[val]> is <<0>>, they return <<-
-INT_MAX>> (<<INT_MAX>> is defined in limits.h). If <[val]> is
-infinite, or NaN, they return <<INT_MAX>>.
+floating-point argument.
+If <[val]> is <<0>>, they return <<FP_ILOGB0>>.
+If <[val]> is infinite, they return <<INT_MAX>>.
+If <[val]> is NaN, they return <<FP_ILOGBNAN>>.
+(<<FP_ILOGB0>> and <<FP_ILOGBNAN>> 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 <<ilogb>> nor <<ilogbf>> 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 <limits.h>
+#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 <limits.h>
+#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;
}