Blame lib/float.in.h

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