This source file includes following definitions.
- test_float
 
- test_double
 
- test_long_double
 
- main
 
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 #include <config.h>
  21 
  22 #include <math.h>
  23 
  24 
  25 #ifndef isnan
  26 # error missing declaration
  27 #endif
  28 
  29 #include <float.h>
  30 #include <limits.h>
  31 
  32 #include "minus-zero.h"
  33 #include "infinity.h"
  34 #include "nan.h"
  35 #include "macros.h"
  36 
  37 static void
  38 test_float (void)
     
  39 {
  40   
  41   ASSERT (!isnan (3.141f));
  42   ASSERT (!isnan (3.141e30f));
  43   ASSERT (!isnan (3.141e-30f));
  44   ASSERT (!isnan (-2.718f));
  45   ASSERT (!isnan (-2.718e30f));
  46   ASSERT (!isnan (-2.718e-30f));
  47   ASSERT (!isnan (0.0f));
  48   ASSERT (!isnan (minus_zerof));
  49   
  50   ASSERT (!isnan (Infinityf ()));
  51   ASSERT (!isnan (- Infinityf ()));
  52   
  53   ASSERT (isnan (NaNf ()));
  54 #if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
  55   
  56   {
  57     #define NWORDSF \
  58       ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
  59     typedef union { float value; unsigned int word[NWORDSF]; } memory_float;
  60     memory_float m;
  61     m.value = NaNf ();
  62 # if FLT_EXPBIT0_BIT > 0
  63     m.word[FLT_EXPBIT0_WORD] ^= (unsigned int) 1 << (FLT_EXPBIT0_BIT - 1);
  64 # else
  65     m.word[FLT_EXPBIT0_WORD + (FLT_EXPBIT0_WORD < NWORDSF / 2 ? 1 : - 1)]
  66       ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
  67 # endif
  68     if (FLT_EXPBIT0_WORD < NWORDSF / 2)
  69       m.word[FLT_EXPBIT0_WORD + 1] |= (unsigned int) 1 << FLT_EXPBIT0_BIT;
  70     else
  71       m.word[0] |= (unsigned int) 1;
  72     ASSERT (isnan (m.value));
  73   }
  74 #endif
  75 }
  76 
  77 static void
  78 test_double (void)
     
  79 {
  80   
  81   ASSERT (!isnan (3.141));
  82   ASSERT (!isnan (3.141e30));
  83   ASSERT (!isnan (3.141e-30));
  84   ASSERT (!isnan (-2.718));
  85   ASSERT (!isnan (-2.718e30));
  86   ASSERT (!isnan (-2.718e-30));
  87   ASSERT (!isnan (0.0));
  88   ASSERT (!isnan (minus_zerod));
  89   
  90   ASSERT (!isnan (Infinityd ()));
  91   ASSERT (!isnan (- Infinityd ()));
  92   
  93   ASSERT (isnan (NaNd ()));
  94 #if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
  95   
  96   {
  97     #define NWORDSD \
  98       ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
  99     typedef union { double value; unsigned int word[NWORDSD]; } memory_double;
 100     memory_double m;
 101     m.value = NaNd ();
 102 # if DBL_EXPBIT0_BIT > 0
 103     m.word[DBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (DBL_EXPBIT0_BIT - 1);
 104 # else
 105     m.word[DBL_EXPBIT0_WORD + (DBL_EXPBIT0_WORD < NWORDSD / 2 ? 1 : - 1)]
 106       ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
 107 # endif
 108     m.word[DBL_EXPBIT0_WORD + (DBL_EXPBIT0_WORD < NWORDSD / 2 ? 1 : - 1)]
 109       |= (unsigned int) 1 << DBL_EXPBIT0_BIT;
 110     ASSERT (isnan (m.value));
 111   }
 112 #endif
 113 }
 114 
 115 static void
 116 test_long_double (void)
     
 117 {
 118   #define NWORDSL \
 119     ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
 120   typedef union { unsigned int word[NWORDSL]; long double value; }
 121           memory_long_double;
 122 
 123   
 124   ASSERT (!isnan (3.141L));
 125   ASSERT (!isnan (3.141e30L));
 126   ASSERT (!isnan (3.141e-30L));
 127   ASSERT (!isnan (-2.718L));
 128   ASSERT (!isnan (-2.718e30L));
 129   ASSERT (!isnan (-2.718e-30L));
 130   ASSERT (!isnan (0.0L));
 131   ASSERT (!isnan (minus_zerol));
 132   
 133   ASSERT (!isnan (Infinityl ()));
 134   ASSERT (!isnan (- Infinityl ()));
 135   
 136   ASSERT (isnan (NaNl ()));
 137 
 138 #if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
 139   
 140 
 141   {
 142 #if defined __powerpc__ && LDBL_MANT_DIG == 106
 143     
 144 
 145 
 146     #undef NWORDSL
 147     #define NWORDSL \
 148       ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
 149 #endif
 150 
 151     memory_long_double m;
 152     m.value = NaNl ();
 153 # if LDBL_EXPBIT0_BIT > 0
 154     m.word[LDBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (LDBL_EXPBIT0_BIT - 1);
 155 # else
 156     m.word[LDBL_EXPBIT0_WORD + (LDBL_EXPBIT0_WORD < NWORDSL / 2 ? 1 : - 1)]
 157       ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
 158 # endif
 159     m.word[LDBL_EXPBIT0_WORD + (LDBL_EXPBIT0_WORD < NWORDSL / 2 ? 1 : - 1)]
 160       |= (unsigned int) 1 << LDBL_EXPBIT0_BIT;
 161     ASSERT (isnan (m.value));
 162   }
 163 #endif
 164 
 165 #if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
 166 
 167 
 168 # ifdef WORDS_BIGENDIAN
 169 #  define LDBL80_WORDS(exponent,manthi,mantlo) \
 170      { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
 171        ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16),   \
 172        (unsigned int) (mantlo) << 16                                        \
 173      }
 174 # else
 175 #  define LDBL80_WORDS(exponent,manthi,mantlo) \
 176      { mantlo, manthi, exponent }
 177 # endif
 178   { 
 179     static memory_long_double x =
 180       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
 181     ASSERT (isnan (x.value));
 182   }
 183   {
 184     
 185     static memory_long_double x =
 186       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
 187     ASSERT (isnan (x.value));
 188   }
 189   
 190   { 
 191     static memory_long_double x =
 192       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
 193     ASSERT (isnan (x.value) || !isnan (x.value));
 194   }
 195   { 
 196     static memory_long_double x =
 197       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
 198     ASSERT (isnan (x.value) || !isnan (x.value));
 199   }
 200   { 
 201     static memory_long_double x =
 202       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
 203     ASSERT (isnan (x.value) || !isnan (x.value));
 204   }
 205   { 
 206     static memory_long_double x =
 207       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
 208     ASSERT (isnan (x.value) || !isnan (x.value));
 209   }
 210   { 
 211     static memory_long_double x =
 212       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
 213     ASSERT (isnan (x.value) || !isnan (x.value));
 214   }
 215 #endif
 216 }
 217 
 218 int
 219 main ()
     
 220 {
 221   test_float ();
 222   test_double ();
 223   test_long_double ();
 224   return 0;
 225 }