improve math.h

Jeff Johnston jjohnstn@redhat.com
Wed May 16 20:06:00 GMT 2007


Ok.

-- Jeff J.

Eric Blake wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> I still don't have frexpl working, but thought I would ask if I can commit
> this in the meantime.
> 
> 2007-05-16  Eric Blake  <ebb9@byu.net>
> 
> 	* libc/include/math.h (INFINITY, NAN, FP_ILOGB0, FP_ILOGBNAN)
> 	(MATH_ERRNO, MATH_ERREXCEPT, math_errhandling): Add macros
> 	required by POSIX.
> 	* libc/stdlib/ldtoa.c (USE_INFINITY): Rename from INFINITY, to
> 	avoid clash with <math.h>.
> 
> - --
> Don't work too hard, make some time for fun as well!
> 
> Eric Blake             ebb9@byu.net
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.5 (Cygwin)
> Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
> 
> iD8DBQFGSvmJ84KuGfSFAYARAs+SAJ0eDF4e9bdh5Mw9zfsl0WWAVq1RcgCfUhCS
> OaxFGH7MJmIlPTAb6rqMDv4=
> =LCZz
> -----END PGP SIGNATURE-----
> 
> 
> ------------------------------------------------------------------------
> 
> Index: libc/stdlib/ldtoa.c
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/stdlib/ldtoa.c,v
> retrieving revision 1.10
> diff -u -p -b -r1.10 ldtoa.c
> --- libc/stdlib/ldtoa.c	16 Jun 2005 19:14:01 -0000	1.10
> +++ libc/stdlib/ldtoa.c	16 May 2007 12:28:29 -0000
> @@ -1,4 +1,3 @@
> -
>   /* Extended precision arithmetic functions for long double I/O.
>    * This program has been placed in the public domain.
>    */
> @@ -244,7 +243,7 @@ static char *ermsg[7] = {
>   *
>   * Exception flags are NOT fully supported.
>   *
> - * Define INFINITY in mconf.h for support of infinity; otherwise a
> + * Define USE_INFINITY in mconf.h for support of infinity; otherwise a
>   * saturation arithmetic is implemented.
>   *
>   * Define NANS for support of Not-a-Number items; otherwise the
> @@ -381,12 +380,12 @@ typedef struct
>  #define VOLATILE 
>  
>  #define NANS
> -#define INFINITY
> +#define USE_INFINITY
>  
>  /* NaN's require infinity support. */
>  #ifdef NANS
>  #ifndef INFINITY
> -#define INFINITY
> +#define USE_INFINITY
>  #endif
>  #endif
>  
> @@ -544,7 +543,7 @@ static void einfin(register short unsign
>  {
>  register int i;
>  
> -#ifdef INFINITY
> +#ifdef USE_INFINITY
>  for( i=0; i<NE-1; i++ )
>  	*x++ = 0;
>  *x |= 32767;
> @@ -596,7 +595,7 @@ else
>  /* get the exponent */
>  *q = *p--;
>  *q++ &= 0x7fff;	/* delete the sign bit */
> -#ifdef INFINITY
> +#ifdef USE_INFINITY
>  if( (*(q-1) & 0x7fff) == 0x7fff )
>  	{
>  #ifdef NANS
> @@ -639,7 +638,7 @@ if( i )
>  	*q-- = *p++ | 0x8000;
>  else
>  	*q-- = *p++;
> -#ifdef INFINITY
> +#ifdef USE_INFINITY
>  if( *(p-1) == 0x7fff )
>  	{
>  #ifdef NANS
> @@ -1173,7 +1172,7 @@ unsigned short r;
>  j = enormlz( s );
>  
>  /* a blank significand could mean either zero or infinity. */
> -#ifndef INFINITY
> +#ifndef USE_INFINITY
>  if( j > NBITS )
>  	{
>  	ecleazs( s );
> @@ -1181,7 +1180,7 @@ if( j > NBITS )
>  	}
>  #endif
>  exp -= j;
> -#ifndef INFINITY
> +#ifndef USE_INFINITY
>  if( exp >= 32767L )
>  	goto overf;
>  #else
> @@ -1329,10 +1328,10 @@ mdfin:
>  s[NI-1] = 0;
>  if( exp >= 32767L )
>  	{
> -#ifndef INFINITY
> +#ifndef USE_INFINITY
>  overf:
>  #endif
> -#ifdef INFINITY
> +#ifdef USE_INFINITY
>  	s[1] = 32767;
>  	for( i=2; i<NI-1; i++ )
>  		s[i] = 0;
> @@ -1405,7 +1404,7 @@ unsigned short ai[NI], bi[NI], ci[NI];
>  int i, lost, j, k;
>  long lt, lta, ltb;
>  
> -#ifdef INFINITY
> +#ifdef USE_INFINITY
>  if( eisinf(a) )
>  	{
>  	emov(a,c);
> @@ -1536,7 +1535,7 @@ if( ((ecmp(a,ezero) == 0) && (ecmp(b,eze
>  	}
>  #endif
>  /* Infinity over anything else is infinity. */
> -#ifdef INFINITY
> +#ifdef USE_INFINITY
>  if( eisinf(b) )
>  	{
>  	if( eisneg(a) ^ eisneg(b) )
> @@ -1640,7 +1639,7 @@ if( (eisinf(a) && (ecmp(b,ezero) == 0))
>  	}
>  #endif
>  /* Infinity times anything else is infinity. */
> -#ifdef INFINITY
> +#ifdef USE_INFINITY
>  if( eisinf(a) || eisinf(b) )
>  	{
>  	if( eisneg(a) ^ eisneg(b) )
> @@ -1719,7 +1718,7 @@ yy[0] = 0;
>  if( r & 0x8000 )
>  	yy[0] = 0xffff;
>  r &= 0x7fff;
> -#ifdef INFINITY
> +#ifdef USE_INFINITY
>  if( r == 0x7fff )
>  	{
>  #ifdef NANS
> @@ -1865,7 +1864,7 @@ if((yy[NE-1] & 0x7fff) == 0 && (yy[NE-2]
>      return;
>    }
>  #endif
> -#ifdef INFINITY
> +#ifdef USE_INFINITY
>  /* Point to the exponent field.  */
>  p = &yy[NE-1];
>  if( (*p & 0x7fff) == 0x7fff )
> @@ -1900,7 +1899,7 @@ if( (*p & 0x7fff) == 0x7fff )
>  		eneg(y);
>  	return;
>  	}
> -#endif /* INFINITY */
> +#endif /* USE_INFINITY */
>  p = yy;
>  q = y;
>  for( i=0; i<NE; i++ )
> @@ -1955,7 +1954,7 @@ else
>  for( i=0; i<4; i++ )
>  	*q++ = *p++;
>  #else
> -#ifdef INFINITY
> +#ifdef USE_INFINITY
>  #ifdef IBMPC
>  if (eiisinf (a))
>          {
> @@ -1967,7 +1966,7 @@ if (eiisinf (a))
>  	return;
>  	}
>  #endif /* IBMPC */
> -#endif /* INFINITY */
> +#endif /* USE_INFINITY */
>  for( i=0; i<4; i++ )
>  	*q-- = *p++;
>  #endif
> @@ -2010,7 +2009,7 @@ if( r & 0x8000 )
>  	yy[0] = 0xffff;
>  yy[M] = (r & 0x0f) | 0x10;
>  r &= ~0x800f;	/* strip sign and 4 significand bits */
> -#ifdef INFINITY
> +#ifdef USE_INFINITY
>  if( r == 0x7ff0 )
>  	{
>  #ifdef NANS
> @@ -2120,7 +2119,7 @@ if( *p++ )
>  i = *p++;
>  if( i >= (unsigned int )2047 )
>  	{	/* Saturate at largest number less than infinity. */
> -#ifdef INFINITY
> +#ifdef USE_INFINITY
>  	*y |= 0x7ff0;
>  #ifdef IBMPC
>  	*(--y) = 0;
> @@ -2132,7 +2131,7 @@ if( i >= (unsigned int )2047 )
>  	*y++ = 0;
>  	*y++ = 0;
>  #endif /* IBMPC */
> -#else /* !INFINITY */
> +#else /* !USE_INFINITY */
>  	*y |= (unsigned short )0x7fef;
>  #ifdef IBMPC
>  	*(--y) = 0xffff;
> @@ -2144,7 +2143,7 @@ if( i >= (unsigned int )2047 )
>  	*y++ = 0xffff;
>  	*y++ = 0xffff;
>  #endif
> -#endif /* !INFINITY */
> +#endif /* !USE_INFINITY */
>  	return;
>  	}
>  if( i == 0 )
> @@ -2202,7 +2201,7 @@ if( r & 0x8000 )
>  	yy[0] = 0xffff;
>  yy[M] = (r & 0x7f) | 0200;
>  r &= ~0x807f;	/* strip sign and 7 significand bits */
> -#ifdef INFINITY
> +#ifdef USE_INFINITY
>  if( r == 0x7f80 )
>  	{
>  #ifdef NANS
> @@ -2285,7 +2284,7 @@ if( *p++ )
>  i = *p++;
>  if( i >= 255 )
>  	{	/* Saturate at largest number less than infinity. */
> -#ifdef INFINITY
> +#ifdef USE_INFINITY
>  	*y |= (unsigned short )0x7f80;
>  #ifdef IBMPC
>  	*(--y) = 0;
> @@ -2297,7 +2296,7 @@ if( i >= 255 )
>  	++y;
>  	*y = 0;
>  #endif
> -#else /* !INFINITY */
> +#else /* !USE_INFINITY */
>  	*y |= (unsigned short )0x7f7f;
>  #ifdef IBMPC
>  	*(--y) = 0xffff;
> @@ -2309,7 +2308,7 @@ if( i >= 255 )
>  	++y;
>  	*y = 0xffff;
>  #endif
> -#endif /* !INFINITY */
> +#endif /* !USE_INFINITY */
>  	return;
>  	}
>  if( i == 0 )
> @@ -3743,7 +3742,3 @@ switch( size )
>  for (i=0; i < n; i++)
>  	*nan++ = *p++;
>  }
> -
> -
> -
> -
> Index: libc/include/math.h
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/include/math.h,v
> retrieving revision 1.25
> diff -u -p -b -r1.25 math.h
> --- libc/include/math.h	26 Apr 2007 19:23:37 -0000	1.25
> +++ libc/include/math.h	16 May 2007 12:28:29 -0000
> @@ -1,4 +1,3 @@
> -
>  #ifndef  _MATH_H_
>  #define  _MATH_H_
>  
> @@ -32,17 +31,25 @@ union __ldmath
>  
>   /* gcc >= 3.3 implicitly defines builtins for HUGE_VALx values.  */
>  
> - #ifndef HUGE_VAL
> -  #define HUGE_VAL (__builtin_huge_val())
> - #endif
> -
> - #ifndef HUGE_VALF
> -  #define HUGE_VALF (__builtin_huge_valf())
> - #endif
> -
> - #ifndef HUGE_VALL
> -  #define HUGE_VALL (__builtin_huge_vall())
> - #endif
> +# ifndef HUGE_VAL
> +#  define HUGE_VAL (__builtin_huge_val())
> +# endif
> +
> +# ifndef HUGE_VALF
> +#  define HUGE_VALF (__builtin_huge_valf())
> +# endif
> +
> +# ifndef HUGE_VALL
> +#  define HUGE_VALL (__builtin_huge_vall())
> +# endif
> +
> +# ifndef INFINITY
> +#  define INFINITY (__builtin_inff())
> +# endif
> +
> +# ifndef NAN
> +#  define NAN (__builtin_nanf(""))
> +# endif
>  
>  #else /* !gcc >= 3.3  */
>  
> @@ -118,6 +125,23 @@ typedef double double_t;
>  #define FP_SUBNORMAL   3
>  #define FP_NORMAL      4
>  
> +#ifndef FP_ILOGB0
> +# define FP_ILOGB0 (-INT_MAX)
> +#endif
> +#ifndef FP_ILOGBNAN
> +# define FP_ILOGBNAN INT_MAX
> +#endif
> +
> +#ifndef MATH_ERRNO
> +# define MATH_ERRNO 1
> +#endif
> +#ifndef MATH_ERREXCEPT
> +# define MATH_ERREXCEPT 2
> +#endif
> +#ifndef math_errhandling
> +# define math_errhandling MATH_ERRNO
> +#endif
> +
>  extern int __isinff (float x);
>  extern int __isinfd (double x);
>  extern int __isnanf (float x);



More information about the Newlib mailing list