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.
This commit is contained in:
parent
9bb1d645b3
commit
451a8eb09a
@ -1,3 +1,16 @@
|
|||||||
|
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.
|
||||||
|
|
||||||
2010-02-09 Daniel Gutson <dgutson@codesourcery.com>
|
2010-02-09 Daniel Gutson <dgutson@codesourcery.com>
|
||||||
|
|
||||||
* libc/machine/arm/arm_asm.h (_ISA_THUMB_2): __ARM_ARCH_7EM__
|
* libc/machine/arm/arm_asm.h (_ISA_THUMB_2): __ARM_ARCH_7EM__
|
||||||
|
@ -44,13 +44,24 @@ DESCRIPTION
|
|||||||
RETURNS
|
RETURNS
|
||||||
|
|
||||||
<<ilogb>> and <<ilogbf>> return the power of two used to form the
|
<<ilogb>> and <<ilogbf>> return the power of two used to form the
|
||||||
floating-point argument. If <[val]> is <<0>>, they return <<-
|
floating-point argument.
|
||||||
INT_MAX>> (<<INT_MAX>> is defined in limits.h). If <[val]> is
|
If <[val]> is <<0>>, they return <<FP_ILOGB0>>.
|
||||||
infinite, or NaN, they return <<INT_MAX>>.
|
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
|
PORTABILITY
|
||||||
Neither <<ilogb>> nor <<ilogbf>> is required by ANSI C or by
|
C99, POSIX
|
||||||
the System V Interface Definition (Issue 2). */
|
*/
|
||||||
|
|
||||||
/* ilogb(double x)
|
/* ilogb(double x)
|
||||||
* return the binary exponent of non-zero x
|
* return the binary exponent of non-zero x
|
||||||
@ -58,8 +69,8 @@ PORTABILITY
|
|||||||
* ilogb(inf/NaN) = 0x7fffffff (no signal is raised)
|
* ilogb(inf/NaN) = 0x7fffffff (no signal is raised)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "fdlibm.h"
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include "fdlibm.h"
|
||||||
|
|
||||||
#ifndef _DOUBLE_IS_32BITS
|
#ifndef _DOUBLE_IS_32BITS
|
||||||
|
|
||||||
@ -76,7 +87,7 @@ PORTABILITY
|
|||||||
hx &= 0x7fffffff;
|
hx &= 0x7fffffff;
|
||||||
if(hx<0x00100000) {
|
if(hx<0x00100000) {
|
||||||
if((hx|lx)==0)
|
if((hx|lx)==0)
|
||||||
return - INT_MAX; /* ilogb(0) = 0x80000001 */
|
return FP_ILOGB0; /* ilogb(0) = special case error */
|
||||||
else /* subnormal x */
|
else /* subnormal x */
|
||||||
if(hx==0) {
|
if(hx==0) {
|
||||||
for (ix = -1043; lx>0; lx<<=1) ix -=1;
|
for (ix = -1043; lx>0; lx<<=1) ix -=1;
|
||||||
@ -86,7 +97,10 @@ PORTABILITY
|
|||||||
return ix;
|
return ix;
|
||||||
}
|
}
|
||||||
else if (hx<0x7ff00000) return (hx>>20)-1023;
|
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 */
|
#endif /* _DOUBLE_IS_32BITS */
|
||||||
|
@ -13,8 +13,8 @@
|
|||||||
* ====================================================
|
* ====================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "fdlibm.h"
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include "fdlibm.h"
|
||||||
|
|
||||||
#ifdef __STDC__
|
#ifdef __STDC__
|
||||||
int ilogbf(float x)
|
int ilogbf(float x)
|
||||||
@ -28,11 +28,14 @@
|
|||||||
GET_FLOAT_WORD(hx,x);
|
GET_FLOAT_WORD(hx,x);
|
||||||
hx &= 0x7fffffff;
|
hx &= 0x7fffffff;
|
||||||
if(FLT_UWORD_IS_ZERO(hx))
|
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)) {
|
if(FLT_UWORD_IS_SUBNORMAL(hx)) {
|
||||||
for (ix = -126,hx<<=8; hx>0; hx<<=1) ix -=1;
|
for (ix = -126,hx<<=8; hx>0; hx<<=1) ix -=1;
|
||||||
return ix;
|
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 if (!FLT_UWORD_IS_FINITE(hx)) return INT_MAX;
|
||||||
else return (hx>>23)-127;
|
else return (hx>>23)-127;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user