Blame lib/float.in.h

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