1 /* Macros for not-a-number. 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 18 /* IBM z/OS supports both hexadecimal and IEEE floating-point formats. The 19 former does not support NaN and its isnan() implementation returns zero 20 for all values. */ 21 #if defined __MVS__ && defined __IBMC__ && !defined __BFP__ 22 # error "NaN is not supported with IBM's hexadecimal floating-point format; please re-compile with -qfloat=ieee" 23 #endif 24 25 /* NaNf () returns a 'float' not-a-number. */ 26 27 /* The Compaq (ex-DEC) C 6.4 compiler and the Microsoft MSVC 9 compiler choke 28 on the expression 0.0 / 0.0. The IBM XL C compiler on z/OS complains. 29 PGI 16.10 complains. */ 30 #if (defined __DECC || defined _MSC_VER \ 31 || (defined __MVS__ && defined __IBMC__) \ 32 || defined __PGI) 33 static float 34 NaNf () /* */ 35 { 36 static float zero = 0.0f; 37 return zero / zero; 38 } 39 #else 40 # define NaNf() (0.0f / 0.0f) 41 #endif 42 43 44 /* NaNd () returns a 'double' not-a-number. */ 45 46 /* The Compaq (ex-DEC) C 6.4 compiler and the Microsoft MSVC 9 compiler choke 47 on the expression 0.0 / 0.0. The IBM XL C compiler on z/OS complains. 48 PGI 16.10 complains. */ 49 #if (defined __DECC || defined _MSC_VER \ 50 || (defined __MVS__ && defined __IBMC__) \ 51 || defined __PGI) 52 static double 53 NaNd () /* */ 54 { 55 static double zero = 0.0; 56 return zero / zero; 57 } 58 #else 59 # define NaNd() (0.0 / 0.0) 60 #endif 61 62 63 /* NaNl () returns a 'long double' not-a-number. */ 64 65 /* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the 66 runtime type conversion. 67 The Microsoft MSVC 9 compiler chokes on the expression 0.0L / 0.0L. 68 The IBM XL C compiler on z/OS complains. 69 PGI 16.10 complains. */ 70 #ifdef __sgi 71 static long double NaNl () /* */ 72 { 73 double zero = 0.0; 74 return zero / zero; 75 } 76 #elif defined _MSC_VER || (defined __MVS__ && defined __IBMC__) || defined __PGI 77 static long double 78 NaNl () /* */ 79 { 80 static long double zero = 0.0L; 81 return zero / zero; 82 } 83 #else 84 # define NaNl() (0.0L / 0.0L) 85 #endif