Blame src/gl/float.in.h

Packit aea12f
/* A correct <float.h>.
Packit aea12f
Packit Service 991b93
   Copyright (C) 2007-2020 Free Software Foundation, Inc.
Packit aea12f
Packit aea12f
   This program is free software: you can redistribute it and/or modify
Packit aea12f
   it under the terms of the GNU General Public License as published by
Packit aea12f
   the Free Software Foundation; either version 3 of the License, or
Packit aea12f
   (at your option) any later version.
Packit aea12f
Packit aea12f
   This program is distributed in the hope that it will be useful,
Packit aea12f
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit aea12f
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit aea12f
   GNU General Public License for more details.
Packit aea12f
Packit aea12f
   You should have received a copy of the GNU General Public License
Packit aea12f
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
Packit aea12f
Packit aea12f
#ifndef _@GUARD_PREFIX@_FLOAT_H
Packit aea12f
Packit aea12f
#if __GNUC__ >= 3
Packit aea12f
@PRAGMA_SYSTEM_HEADER@
Packit aea12f
#endif
Packit aea12f
@PRAGMA_COLUMNS@
Packit aea12f
Packit aea12f
/* The include_next requires a split double-inclusion guard.  */
Packit aea12f
#@INCLUDE_NEXT@ @NEXT_FLOAT_H@
Packit aea12f
Packit aea12f
#ifndef _@GUARD_PREFIX@_FLOAT_H
Packit aea12f
#define _@GUARD_PREFIX@_FLOAT_H
Packit aea12f
Packit aea12f
/* 'long double' properties.  */
Packit aea12f
Packit aea12f
#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
Packit aea12f
/* Number of mantissa units, in base FLT_RADIX.  */
Packit aea12f
# undef LDBL_MANT_DIG
Packit aea12f
# define LDBL_MANT_DIG   64
Packit aea12f
/* Number of decimal digits that is sufficient for representing a number.  */
Packit aea12f
# undef LDBL_DIG
Packit aea12f
# define LDBL_DIG        18
Packit aea12f
/* x-1 where x is the smallest representable number > 1.  */
Packit aea12f
# undef LDBL_EPSILON
Packit aea12f
# define LDBL_EPSILON    1.0842021724855044340E-19L
Packit aea12f
/* Minimum e such that FLT_RADIX^(e-1) is a normalized number.  */
Packit aea12f
# undef LDBL_MIN_EXP
Packit aea12f
# define LDBL_MIN_EXP    (-16381)
Packit aea12f
/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number.  */
Packit aea12f
# undef LDBL_MAX_EXP
Packit aea12f
# define LDBL_MAX_EXP    16384
Packit aea12f
/* Minimum positive normalized number.  */
Packit aea12f
# undef LDBL_MIN
Packit aea12f
# define LDBL_MIN        3.3621031431120935063E-4932L
Packit aea12f
/* Maximum representable finite number.  */
Packit aea12f
# undef LDBL_MAX
Packit aea12f
# define LDBL_MAX        1.1897314953572317650E+4932L
Packit aea12f
/* Minimum e such that 10^e is in the range of normalized numbers.  */
Packit aea12f
# undef LDBL_MIN_10_EXP
Packit aea12f
# define LDBL_MIN_10_EXP (-4931)
Packit aea12f
/* Maximum e such that 10^e is in the range of representable finite numbers.  */
Packit aea12f
# undef LDBL_MAX_10_EXP
Packit aea12f
# define LDBL_MAX_10_EXP 4932
Packit aea12f
#endif
Packit aea12f
Packit aea12f
/* On FreeBSD/x86 6.4, the 'long double' type really has only 53 bits of
Packit aea12f
   precision in the compiler but 64 bits of precision at runtime.  See
Packit aea12f
   <https://lists.gnu.org/r/bug-gnulib/2008-07/msg00063.html>.  */
Packit aea12f
#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
Packit aea12f
/* Number of mantissa units, in base FLT_RADIX.  */
Packit aea12f
# undef LDBL_MANT_DIG
Packit aea12f
# define LDBL_MANT_DIG   64
Packit aea12f
/* Number of decimal digits that is sufficient for representing a number.  */
Packit aea12f
# undef LDBL_DIG
Packit aea12f
# define LDBL_DIG        18
Packit aea12f
/* x-1 where x is the smallest representable number > 1.  */
Packit aea12f
# undef LDBL_EPSILON
Packit aea12f
# define LDBL_EPSILON 1.084202172485504434007452800869941711426e-19L /* 2^-63 */
Packit aea12f
/* Minimum e such that FLT_RADIX^(e-1) is a normalized number.  */
Packit aea12f
# undef LDBL_MIN_EXP
Packit aea12f
# define LDBL_MIN_EXP    (-16381)
Packit aea12f
/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number.  */
Packit aea12f
# undef LDBL_MAX_EXP
Packit aea12f
# define LDBL_MAX_EXP    16384
Packit aea12f
/* Minimum positive normalized number.  */
Packit aea12f
# undef LDBL_MIN
Packit aea12f
# define LDBL_MIN        3.362103143112093506262677817321752E-4932L /* = 0x1p-16382L */
Packit aea12f
/* Maximum representable finite number.  */
Packit aea12f
# undef LDBL_MAX
Packit aea12f
/* LDBL_MAX is represented as { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }.
Packit aea12f
   But the largest literal that GCC allows us to write is
Packit aea12f
   0x0.fffffffffffff8p16384L = { 0xFFFFF800, 0xFFFFFFFF, 32766 }.
Packit aea12f
   So, define it like this through a reference to an external variable
Packit aea12f
Packit aea12f
     const unsigned int LDBL_MAX[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 32766 };
Packit aea12f
     extern const long double LDBL_MAX;
Packit aea12f
Packit aea12f
   Unfortunately, this is not a constant expression.  */
Packit aea12f
union gl_long_double_union
Packit aea12f
  {
Packit aea12f
    struct { unsigned int lo; unsigned int hi; unsigned int exponent; } xd;
Packit aea12f
    long double ld;
Packit aea12f
  };
Packit aea12f
extern const union gl_long_double_union gl_LDBL_MAX;
Packit aea12f
# define LDBL_MAX (gl_LDBL_MAX.ld)
Packit aea12f
/* Minimum e such that 10^e is in the range of normalized numbers.  */
Packit aea12f
# undef LDBL_MIN_10_EXP
Packit aea12f
# define LDBL_MIN_10_EXP (-4931)
Packit aea12f
/* Maximum e such that 10^e is in the range of representable finite numbers.  */
Packit aea12f
# undef LDBL_MAX_10_EXP
Packit aea12f
# define LDBL_MAX_10_EXP 4932
Packit aea12f
#endif
Packit aea12f
Packit aea12f
/* On AIX 7.1 with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_MAX are
Packit aea12f
   wrong.
Packit aea12f
   On Linux/PowerPC with gcc 4.4, the value of LDBL_MAX is wrong.  */
Packit aea12f
#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
Packit aea12f
# undef LDBL_MIN_EXP
Packit aea12f
# define LDBL_MIN_EXP DBL_MIN_EXP
Packit aea12f
# undef LDBL_MIN_10_EXP
Packit aea12f
# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
Packit aea12f
# undef LDBL_MIN
Packit aea12f
# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
Packit aea12f
#endif
Packit aea12f
#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
Packit aea12f
# undef LDBL_MAX
Packit aea12f
/* LDBL_MAX is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xFFFFFFFF }.
Packit aea12f
   It is not easy to define:
Packit aea12f
     #define LDBL_MAX 1.79769313486231580793728971405302307166e308L
Packit aea12f
   is too small, whereas
Packit aea12f
     #define LDBL_MAX 1.79769313486231580793728971405302307167e308L
Packit aea12f
   is too large.  Apparently a bug in GCC decimal-to-binary conversion.
Packit aea12f
   Also, I can't get values larger than
Packit aea12f
     #define LDBL63 ((long double) (1ULL << 63))
Packit aea12f
     #define LDBL882 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
Packit aea12f
     #define LDBL945 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
Packit aea12f
     #define LDBL1008 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
Packit aea12f
     #define LDBL_MAX (LDBL1008 * 65535.0L + LDBL945 * (long double) 9223372036821221375ULL + LDBL882 * (long double) 4611686018427387904ULL)
Packit aea12f
   which is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xF8000000 }.
Packit aea12f
   So, define it like this through a reference to an external variable
Packit aea12f
Packit aea12f
     const double LDBL_MAX[2] = { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL };
Packit aea12f
     extern const long double LDBL_MAX;
Packit aea12f
Packit aea12f
   or through a pointer cast
Packit aea12f
Packit aea12f
     #define LDBL_MAX \
Packit aea12f
       (*(const long double *) (double[]) { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL })
Packit aea12f
Packit aea12f
   Unfortunately, this is not a constant expression, and the latter expression
Packit aea12f
   does not work well when GCC is optimizing..  */
Packit aea12f
union gl_long_double_union
Packit aea12f
  {
Packit aea12f
    struct { double hi; double lo; } dd;
Packit aea12f
    long double ld;
Packit aea12f
  };
Packit aea12f
extern const union gl_long_double_union gl_LDBL_MAX;
Packit aea12f
# define LDBL_MAX (gl_LDBL_MAX.ld)
Packit aea12f
#endif
Packit aea12f
Packit aea12f
/* On IRIX 6.5, with cc, the value of LDBL_MANT_DIG is wrong.
Packit aea12f
   On IRIX 6.5, with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_EPSILON
Packit aea12f
   are wrong.  */
Packit aea12f
#if defined __sgi && (LDBL_MANT_DIG >= 106)
Packit aea12f
# undef LDBL_MANT_DIG
Packit aea12f
# define LDBL_MANT_DIG 106
Packit aea12f
# if defined __GNUC__
Packit aea12f
#  undef LDBL_MIN_EXP
Packit aea12f
#  define LDBL_MIN_EXP DBL_MIN_EXP
Packit aea12f
#  undef LDBL_MIN_10_EXP
Packit aea12f
#  define LDBL_MIN_10_EXP DBL_MIN_10_EXP
Packit aea12f
#  undef LDBL_MIN
Packit aea12f
#  define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
Packit aea12f
#  undef LDBL_EPSILON
Packit aea12f
#  define LDBL_EPSILON 2.46519032881566189191165176650870696773e-32L /* 2^-105 */
Packit aea12f
# endif
Packit aea12f
#endif
Packit aea12f
Packit aea12f
#if @REPLACE_ITOLD@
Packit aea12f
/* Pull in a function that fixes the 'int' to 'long double' conversion
Packit aea12f
   of glibc 2.7.  */
Packit aea12f
extern
Packit aea12f
# ifdef __cplusplus
Packit aea12f
"C"
Packit aea12f
# endif
Packit aea12f
void _Qp_itoq (long double *, int);
Packit aea12f
static void (*_gl_float_fix_itold) (long double *, int) = _Qp_itoq;
Packit aea12f
#endif
Packit aea12f
Packit aea12f
#endif /* _@GUARD_PREFIX@_FLOAT_H */
Packit aea12f
#endif /* _@GUARD_PREFIX@_FLOAT_H */