105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* A correct <float.h>.
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 2007-2012 Free Software Foundation, Inc.
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   it under the terms of the GNU General Public License as published by
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation; either version 3 of the License, or
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is distributed in the hope that it will be useful,
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   but WITHOUT ANY WARRANTY; without even the implied warranty of
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   GNU General Public License for more details.
1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   You should have received a copy of the GNU General Public License
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _@GUARD_PREFIX@_FLOAT_H
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if __GNUC__ >= 3
2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang@PRAGMA_SYSTEM_HEADER@
2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang@PRAGMA_COLUMNS@
2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The include_next requires a split double-inclusion guard.  */
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#@INCLUDE_NEXT@ @NEXT_FLOAT_H@
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _@GUARD_PREFIX@_FLOAT_H
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _@GUARD_PREFIX@_FLOAT_H
3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* 'long double' properties.  */
3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Number of mantissa units, in base FLT_RADIX.  */
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MANT_DIG
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MANT_DIG   64
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Number of decimal digits that is sufficient for representing a number.  */
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_DIG
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_DIG        18
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* x-1 where x is the smallest representable number > 1.  */
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_EPSILON
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_EPSILON    1.0842021724855044340E-19L
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Minimum e such that FLT_RADIX^(e-1) is a normalized number.  */
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MIN_EXP
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MIN_EXP    (-16381)
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number.  */
4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MAX_EXP
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MAX_EXP    16384
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Minimum positive normalized number.  */
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MIN
5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MIN        3.3621031431120935063E-4932L
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Maximum representable finite number.  */
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MAX
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MAX        1.1897314953572317650E+4932L
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Minimum e such that 10^e is in the range of normalized numbers.  */
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MIN_10_EXP
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MIN_10_EXP (-4931)
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Maximum e such that 10^e is in the range of representable finite numbers.  */
5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MAX_10_EXP
6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MAX_10_EXP 4932
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* On FreeBSD/x86 6.4, the 'long double' type really has only 53 bits of
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   precision in the compiler but 64 bits of precision at runtime.  See
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   <http://lists.gnu.org/archive/html/bug-gnulib/2008-07/msg00063.html>.  */
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __i386__ && defined __FreeBSD__
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Number of mantissa units, in base FLT_RADIX.  */
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MANT_DIG
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MANT_DIG   64
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Number of decimal digits that is sufficient for representing a number.  */
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_DIG
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_DIG        18
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* x-1 where x is the smallest representable number > 1.  */
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_EPSILON
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_EPSILON 1.084202172485504434007452800869941711426e-19L /* 2^-63 */
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Minimum e such that FLT_RADIX^(e-1) is a normalized number.  */
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MIN_EXP
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MIN_EXP    (-16381)
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number.  */
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MAX_EXP
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MAX_EXP    16384
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Minimum positive normalized number.  */
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MIN
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MIN        3.3621031431120935E-4932L /* = 0x1p-16382L */
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Maximum representable finite number.  */
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MAX
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* LDBL_MAX is represented as { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }.
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   But the largest literal that GCC allows us to write is
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   0x0.fffffffffffff8p16384L = { 0xFFFFF800, 0xFFFFFFFF, 32766 }.
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   So, define it like this through a reference to an external variable
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang     const unsigned int LDBL_MAX[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 32766 };
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang     extern const long double LDBL_MAX;
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Unfortunately, this is not a constant expression.  */
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wangunion gl_long_double_union
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  {
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    struct { unsigned int lo; unsigned int hi; unsigned int exponent; } xd;
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    long double ld;
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  };
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern const union gl_long_double_union gl_LDBL_MAX;
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MAX (gl_LDBL_MAX.ld)
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Minimum e such that 10^e is in the range of normalized numbers.  */
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MIN_10_EXP
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MIN_10_EXP (-4931)
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Maximum e such that 10^e is in the range of representable finite numbers.  */
10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MAX_10_EXP
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MAX_10_EXP 4932
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* On AIX 7.1 with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_MAX are
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   wrong.
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   On Linux/PowerPC with gcc 4.4, the value of LDBL_MAX is wrong.  */
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MIN_EXP
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MIN_EXP DBL_MIN_EXP
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MIN_10_EXP
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MIN
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MAX
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* LDBL_MAX is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xFFFFFFFF }.
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   It is not easy to define:
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang     #define LDBL_MAX 1.79769313486231580793728971405302307166e308L
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   is too small, whereas
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang     #define LDBL_MAX 1.79769313486231580793728971405302307167e308L
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   is too large.  Apparently a bug in GCC decimal-to-binary conversion.
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Also, I can't get values larger than
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang     #define LDBL63 ((long double) (1ULL << 63))
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang     #define LDBL882 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang     #define LDBL945 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang     #define LDBL1008 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang     #define LDBL_MAX (LDBL1008 * 65535.0L + LDBL945 * (long double) 9223372036821221375ULL + LDBL882 * (long double) 4611686018427387904ULL)
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   which is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xF8000000 }.
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   So, define it like this through a reference to an external variable
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang     const double LDBL_MAX[2] = { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL };
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     extern const long double LDBL_MAX;
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   or through a pointer cast
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang     #define LDBL_MAX \
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       (*(const long double *) (double[]) { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL })
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Unfortunately, this is not a constant expression, and the latter expression
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   does not work well when GCC is optimizing..  */
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wangunion gl_long_double_union
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  {
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    struct { double hi; double lo; } dd;
15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    long double ld;
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  };
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern const union gl_long_double_union gl_LDBL_MAX;
15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MAX (gl_LDBL_MAX.ld)
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* On IRIX 6.5, with cc, the value of LDBL_MANT_DIG is wrong.
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   On IRIX 6.5, with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_EPSILON
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   are wrong.  */
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __sgi && (LDBL_MANT_DIG >= 106)
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef LDBL_MANT_DIG
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define LDBL_MANT_DIG 106
16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if defined __GNUC__
16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef LDBL_MIN_EXP
16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define LDBL_MIN_EXP DBL_MIN_EXP
16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef LDBL_MIN_10_EXP
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define LDBL_MIN_10_EXP DBL_MIN_10_EXP
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef LDBL_MIN
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef LDBL_EPSILON
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define LDBL_EPSILON 2.46519032881566189191165176650870696773e-32L /* 2^-105 */
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @REPLACE_ITOLD@
17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Pull in a function that fixes the 'int' to 'long double' conversion
17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   of glibc 2.7.  */
17905436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern
18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ifdef __cplusplus
18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang"C"
18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
18305436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid _Qp_itoq (long double *, int);
18405436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void (*_gl_float_fix_itold) (long double *, int) = _Qp_itoq;
18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif /* _@GUARD_PREFIX@_FLOAT_H */
18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif /* _@GUARD_PREFIX@_FLOAT_H */
189