root/maint/gnulib/tests/test-isnan.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. test_float
  2. test_double
  3. test_long_double
  4. main

   1 /* Test of isnand() substitute.
   2    Copyright (C) 2007-2021 Free Software Foundation, Inc.
   3 
   4    This program is free software: you can redistribute it and/or modify
   5    it under the terms of the GNU General Public License as published by
   6    the Free Software Foundation; either version 3 of the License, or
   7    (at your option) any later version.
   8 
   9    This program is distributed in the hope that it will be useful,
  10    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12    GNU General Public License for more details.
  13 
  14    You should have received a copy of the GNU General Public License
  15    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  16 
  17 /* Written by Ben Pfaff <blp@cs.stanford.edu>, from code by Bruno
  18    Haible <bruno@clisp.org>.  */
  19 
  20 #include <config.h>
  21 
  22 #include <math.h>
  23 
  24 /* isnan must be a macro.  */
  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)
     /* [previous][next][first][last][top][bottom][index][help] */
  39 {
  40   /* Finite values.  */
  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   /* Infinite values.  */
  50   ASSERT (!isnan (Infinityf ()));
  51   ASSERT (!isnan (- Infinityf ()));
  52   /* Quiet NaN.  */
  53   ASSERT (isnan (NaNf ()));
  54 #if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
  55   /* Signalling NaN.  */
  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)
     /* [previous][next][first][last][top][bottom][index][help] */
  79 {
  80   /* Finite values.  */
  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   /* Infinite values.  */
  90   ASSERT (!isnan (Infinityd ()));
  91   ASSERT (!isnan (- Infinityd ()));
  92   /* Quiet NaN.  */
  93   ASSERT (isnan (NaNd ()));
  94 #if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
  95   /* Signalling NaN.  */
  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)
     /* [previous][next][first][last][top][bottom][index][help] */
 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   /* Finite values.  */
 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   /* Infinite values.  */
 133   ASSERT (!isnan (Infinityl ()));
 134   ASSERT (!isnan (- Infinityl ()));
 135   /* Quiet NaN.  */
 136   ASSERT (isnan (NaNl ()));
 137 
 138 #if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
 139   /* A bit pattern that is different from a Quiet NaN.  With a bit of luck,
 140      it's a Signalling NaN.  */
 141   {
 142 #if defined __powerpc__ && LDBL_MANT_DIG == 106
 143     /* This is PowerPC "double double", a pair of two doubles.  Inf and Nan are
 144        represented as the corresponding 64-bit IEEE values in the first double;
 145        the second is ignored.  Manipulate only the first double.  */
 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 /* Representation of an 80-bit 'long double' as an initializer for a sequence
 167    of 'unsigned int' words.  */
 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   { /* Quiet NaN.  */
 179     static memory_long_double x =
 180       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
 181     ASSERT (isnan (x.value));
 182   }
 183   {
 184     /* Signalling NaN.  */
 185     static memory_long_double x =
 186       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
 187     ASSERT (isnan (x.value));
 188   }
 189   /* isnan should return something for noncanonical values.  */
 190   { /* Pseudo-NaN.  */
 191     static memory_long_double x =
 192       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
 193     ASSERT (isnan (x.value) || !isnan (x.value));
 194   }
 195   { /* Pseudo-Infinity.  */
 196     static memory_long_double x =
 197       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
 198     ASSERT (isnan (x.value) || !isnan (x.value));
 199   }
 200   { /* Pseudo-Zero.  */
 201     static memory_long_double x =
 202       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
 203     ASSERT (isnan (x.value) || !isnan (x.value));
 204   }
 205   { /* Unnormalized number.  */
 206     static memory_long_double x =
 207       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
 208     ASSERT (isnan (x.value) || !isnan (x.value));
 209   }
 210   { /* Pseudo-Denormal.  */
 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 ()
     /* [previous][next][first][last][top][bottom][index][help] */
 220 {
 221   test_float ();
 222   test_double ();
 223   test_long_double ();
 224   return 0;
 225 }

/* [previous][next][first][last][top][bottom][index][help] */