1 /* Test of isnanf() substitute. 2 Copyright (C) 2007-2020 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 (!isnanf (3.141f)); 31 ASSERT (!isnanf (3.141e30f)); 32 ASSERT (!isnanf (3.141e-30f)); 33 ASSERT (!isnanf (-2.718f)); 34 ASSERT (!isnanf (-2.718e30f)); 35 ASSERT (!isnanf (-2.718e-30f)); 36 ASSERT (!isnanf (0.0f)); 37 ASSERT (!isnanf (minus_zerof)); 38 /* Infinite values. */ 39 ASSERT (!isnanf (Infinityf ())); 40 ASSERT (!isnanf (- Infinityf ())); 41 /* Quiet NaN. */ 42 ASSERT (isnanf (NaNf ())); 43 #if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT 44 /* Signalling NaN. */ 45 { 46 #define NWORDS \ 47 ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) 48 typedef union { float value; unsigned int word[NWORDS]; } memory_float; 49 memory_float m; 50 m.value = NaNf (); 51 # if FLT_EXPBIT0_BIT > 0 52 m.word[FLT_EXPBIT0_WORD] ^= (unsigned int) 1 << (FLT_EXPBIT0_BIT - 1); 53 # else 54 m.word[FLT_EXPBIT0_WORD + (FLT_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)] 55 ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1); 56 # endif 57 if (FLT_EXPBIT0_WORD < NWORDS / 2) 58 m.word[FLT_EXPBIT0_WORD + 1] |= (unsigned int) 1 << FLT_EXPBIT0_BIT; 59 else 60 m.word[0] |= (unsigned int) 1; 61 ASSERT (isnanf (m.value)); 62 } 63 #endif 64 return 0; 65 } 66