1 /* Test of isnand() substitute. 2 Copyright (C) 2007-2018 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 Bruno Haible <bruno@clisp.org>, 2007. */ 18 19 #include <limits.h> 20 21 #include "minus-zero.h" 22 #include "infinity.h" 23 #include "nan.h" 24 #include "macros.h" 25 26 int main()27main () 28 { 29 /* Finite values. */ 30 ASSERT (!isnand (3.141)); 31 ASSERT (!isnand (3.141e30)); 32 ASSERT (!isnand (3.141e-30)); 33 ASSERT (!isnand (-2.718)); 34 ASSERT (!isnand (-2.718e30)); 35 ASSERT (!isnand (-2.718e-30)); 36 ASSERT (!isnand (0.0)); 37 ASSERT (!isnand (minus_zerod)); 38 /* Infinite values. */ 39 ASSERT (!isnand (Infinityd ())); 40 ASSERT (!isnand (- Infinityd ())); 41 /* Quiet NaN. */ 42 ASSERT (isnand (NaNd ())); 43 #if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT 44 /* Signalling NaN. */ 45 { 46 #define NWORDS \ 47 ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) 48 typedef union { double value; unsigned int word[NWORDS]; } memory_double; 49 memory_double m; 50 m.value = NaNd (); 51 # if DBL_EXPBIT0_BIT > 0 52 m.word[DBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (DBL_EXPBIT0_BIT - 1); 53 # else 54 m.word[DBL_EXPBIT0_WORD + (DBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)] 55 ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1); 56 # endif 57 m.word[DBL_EXPBIT0_WORD + (DBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)] 58 |= (unsigned int) 1 << DBL_EXPBIT0_BIT; 59 ASSERT (isnand (m.value)); 60 } 61 #endif 62 return 0; 63 } 64