(root)/
coreutils-9.4/
gnulib-tests/
nan.h
       1  /* Macros for not-a-number.
       2     Copyright (C) 2007-2023 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