Blame gnulib/lib/float.in.h

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