OSDN Git Service

* libc/include/math.h (INFINITY, NAN, FP_ILOGB0, FP_ILOGBNAN)
authorericb <ericb>
Wed, 16 May 2007 19:59:36 +0000 (19:59 +0000)
committerericb <ericb>
Wed, 16 May 2007 19:59:36 +0000 (19:59 +0000)
(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>.

newlib/ChangeLog
newlib/libc/include/math.h
newlib/libc/stdlib/ldtoa.c

index 6e56ebe..699dbd4 100644 (file)
@@ -1,5 +1,11 @@
 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>.
+
        * libc/stdlib/wctomb_r.c (_wctomb_r): Avoid gcc warnings on cygwin.
        * libc/search/hash.c (__hash_open): Likewise.
 
index 63cc992..f161fe7 100644 (file)
@@ -1,4 +1,3 @@
-
 #ifndef  _MATH_H_
 #define  _MATH_H_
 
@@ -13,13 +12,13 @@ union __dmath
   __ULong i[2];
   double d;
 };
+
 union __fmath
 {
   __ULong i[1];
   float f;
 };
+
 union __ldmath
 {
   __ULong i[4];
@@ -32,23 +31,31 @@ union __ldmath
 
  /* gcc >= 3.3 implicitly defines builtins for HUGE_VALx values.  */
 
- #ifndef HUGE_VAL
-  #define HUGE_VAL (__builtin_huge_val())
- #endif
+ifndef HUGE_VAL
+#  define HUGE_VAL (__builtin_huge_val())
+endif
 
- #ifndef HUGE_VALF
-  #define HUGE_VALF (__builtin_huge_valf())
- #endif
+ifndef HUGE_VALF
+#  define HUGE_VALF (__builtin_huge_valf())
+endif
 
- #ifndef HUGE_VALL
-  #define HUGE_VALL (__builtin_huge_vall())
- #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  */
 
- /* No builtins.  Use floating-point unions instead.  Declare as an array 
-    without bounds so no matter what small data support a port and/or 
-    library has, the reference will be via the general method for accessing 
+ /* No builtins.  Use floating-point unions instead.  Declare as an array
+    without bounds so no matter what small data support a port and/or
+    library has, the reference will be via the general method for accessing
     globals. */
 
  #ifndef HUGE_VAL
@@ -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);
@@ -347,9 +371,9 @@ extern int *__signgam _PARAMS((void));
 /* We have a problem when using C++ since `exception' is a reserved
    name in C++.  */
 #ifdef __cplusplus
-struct __exception 
+struct __exception
 #else
-struct exception 
+struct exception
 #endif
 {
   int type;
@@ -397,7 +421,7 @@ extern int matherr _PARAMS((struct exception *e));
 #define M_SQRT1_2      0.70710678118654752440
 #define M_LN2LO         1.9082149292705877000E-10
 #define M_LN2HI         6.9314718036912381649E-1
-#define M_SQRT3        1.73205080756887719000
+#define M_SQRT3        1.73205080756887719000
 #define M_IVLN10        0.43429448190325182765 /* 1 / log(10) */
 #define M_LOG2_E        0.693147180559945309417
 #define M_INVLN2        1.4426950408889633870E0  /* 1 / log(2) */
index 6a29dda..d445793 100644 (file)
@@ -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 unsigned int *x, register LDPARMS *ldp)
 {
 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,ezero) == 0))
        }
 #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] & 0x8000) == 0)
     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++;
 }
-
-
-
-