xref: /netbsd-src/external/gpl3/gcc/dist/libstdc++-v3/include/std/limits (revision b1e838363e3c6fc78a55519254d99869742dd33c)
14fee23f9Smrg// The template and inlines for the numeric_limits classes. -*- C++ -*-
24fee23f9Smrg
3*b1e83836Smrg// Copyright (C) 1999-2022 Free Software Foundation, Inc.
44fee23f9Smrg//
54fee23f9Smrg// This file is part of the GNU ISO C++ Library.  This library is free
64fee23f9Smrg// software; you can redistribute it and/or modify it under the
74fee23f9Smrg// terms of the GNU General Public License as published by the
84fee23f9Smrg// Free Software Foundation; either version 3, or (at your option)
94fee23f9Smrg// any later version.
104fee23f9Smrg
114fee23f9Smrg// This library is distributed in the hope that it will be useful,
124fee23f9Smrg// but WITHOUT ANY WARRANTY; without even the implied warranty of
134fee23f9Smrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
144fee23f9Smrg// GNU General Public License for more details.
154fee23f9Smrg
164fee23f9Smrg// Under Section 7 of GPL version 3, you are granted additional
174fee23f9Smrg// permissions described in the GCC Runtime Library Exception, version
184fee23f9Smrg// 3.1, as published by the Free Software Foundation.
194fee23f9Smrg
204fee23f9Smrg// You should have received a copy of the GNU General Public License and
214fee23f9Smrg// a copy of the GCC Runtime Library Exception along with this program;
224fee23f9Smrg// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
234fee23f9Smrg// <http://www.gnu.org/licenses/>.
244fee23f9Smrg
2548fb7bfaSmrg/** @file include/limits
264fee23f9Smrg *  This is a Standard C++ Library header.
274fee23f9Smrg */
284fee23f9Smrg
294fee23f9Smrg// Note: this is not a conforming implementation.
304fee23f9Smrg// Written by Gabriel Dos Reis <gdr@codesourcery.com>
314fee23f9Smrg
324fee23f9Smrg//
334fee23f9Smrg// ISO 14882:1998
344fee23f9Smrg// 18.2.1
354fee23f9Smrg//
364fee23f9Smrg
374fee23f9Smrg#ifndef _GLIBCXX_NUMERIC_LIMITS
384fee23f9Smrg#define _GLIBCXX_NUMERIC_LIMITS 1
394fee23f9Smrg
404fee23f9Smrg#pragma GCC system_header
414fee23f9Smrg
424fee23f9Smrg#include <bits/c++config.h>
434fee23f9Smrg
444fee23f9Smrg//
454fee23f9Smrg// The numeric_limits<> traits document implementation-defined aspects
464fee23f9Smrg// of fundamental arithmetic data types (integers and floating points).
474fee23f9Smrg// From Standard C++ point of view, there are 14 such types:
484fee23f9Smrg//   * integers
494fee23f9Smrg//         bool							(1)
504fee23f9Smrg//         char, signed char, unsigned char, wchar_t            (4)
514fee23f9Smrg//         short, unsigned short				(2)
524fee23f9Smrg//         int, unsigned					(2)
534fee23f9Smrg//         long, unsigned long					(2)
544fee23f9Smrg//
554fee23f9Smrg//   * floating points
564fee23f9Smrg//         float						(1)
574fee23f9Smrg//         double						(1)
584fee23f9Smrg//         long double						(1)
594fee23f9Smrg//
604fee23f9Smrg// GNU C++ understands (where supported by the host C-library)
614fee23f9Smrg//   * integer
624fee23f9Smrg//         long long, unsigned long long			(2)
634fee23f9Smrg//
644fee23f9Smrg// which brings us to 16 fundamental arithmetic data types in GNU C++.
654fee23f9Smrg//
664fee23f9Smrg//
674fee23f9Smrg// Since a numeric_limits<> is a bit tricky to get right, we rely on
684fee23f9Smrg// an interface composed of macros which should be defined in config/os
694fee23f9Smrg// or config/cpu when they differ from the generic (read arbitrary)
704fee23f9Smrg// definitions given here.
714fee23f9Smrg//
724fee23f9Smrg
734fee23f9Smrg// These values can be overridden in the target configuration file.
744fee23f9Smrg// The default values are appropriate for many 32-bit targets.
754fee23f9Smrg
764fee23f9Smrg// GCC only intrinsically supports modulo integral types.  The only remaining
774fee23f9Smrg// integral exceptional values is division by zero.  Only targets that do not
784fee23f9Smrg// signal division by zero in some "hard to ignore" way should use false.
794fee23f9Smrg#ifndef __glibcxx_integral_traps
804fee23f9Smrg# define __glibcxx_integral_traps true
814fee23f9Smrg#endif
824fee23f9Smrg
834fee23f9Smrg// float
844fee23f9Smrg//
854fee23f9Smrg
864fee23f9Smrg// Default values.  Should be overridden in configuration files if necessary.
874fee23f9Smrg
884fee23f9Smrg#ifndef __glibcxx_float_has_denorm_loss
894fee23f9Smrg#  define __glibcxx_float_has_denorm_loss false
904fee23f9Smrg#endif
914fee23f9Smrg#ifndef __glibcxx_float_traps
924fee23f9Smrg#  define __glibcxx_float_traps false
934fee23f9Smrg#endif
944fee23f9Smrg#ifndef __glibcxx_float_tinyness_before
954fee23f9Smrg#  define __glibcxx_float_tinyness_before false
964fee23f9Smrg#endif
974fee23f9Smrg
984fee23f9Smrg// double
994fee23f9Smrg
1004fee23f9Smrg// Default values.  Should be overridden in configuration files if necessary.
1014fee23f9Smrg
1024fee23f9Smrg#ifndef __glibcxx_double_has_denorm_loss
1034fee23f9Smrg#  define __glibcxx_double_has_denorm_loss false
1044fee23f9Smrg#endif
1054fee23f9Smrg#ifndef __glibcxx_double_traps
1064fee23f9Smrg#  define __glibcxx_double_traps false
1074fee23f9Smrg#endif
1084fee23f9Smrg#ifndef __glibcxx_double_tinyness_before
1094fee23f9Smrg#  define __glibcxx_double_tinyness_before false
1104fee23f9Smrg#endif
1114fee23f9Smrg
1124fee23f9Smrg// long double
1134fee23f9Smrg
1144fee23f9Smrg// Default values.  Should be overridden in configuration files if necessary.
1154fee23f9Smrg
1164fee23f9Smrg#ifndef __glibcxx_long_double_has_denorm_loss
1174fee23f9Smrg#  define __glibcxx_long_double_has_denorm_loss false
1184fee23f9Smrg#endif
1194fee23f9Smrg#ifndef __glibcxx_long_double_traps
1204fee23f9Smrg#  define __glibcxx_long_double_traps false
1214fee23f9Smrg#endif
1224fee23f9Smrg#ifndef __glibcxx_long_double_tinyness_before
1234fee23f9Smrg#  define __glibcxx_long_double_tinyness_before false
1244fee23f9Smrg#endif
1254fee23f9Smrg
1264fee23f9Smrg// You should not need to define any macros below this point.
1274fee23f9Smrg
1284d5abbe8Smrg#define __glibcxx_signed_b(T,B)	((T)(-1) < 0)
1294fee23f9Smrg
1304d5abbe8Smrg#define __glibcxx_min_b(T,B)					\
1314d5abbe8Smrg  (__glibcxx_signed_b (T,B) ? -__glibcxx_max_b (T,B) - 1 : (T)0)
1324fee23f9Smrg
1334d5abbe8Smrg#define __glibcxx_max_b(T,B)						\
1344d5abbe8Smrg  (__glibcxx_signed_b (T,B) ?						\
1354d5abbe8Smrg   (((((T)1 << (__glibcxx_digits_b (T,B) - 1)) - 1) << 1) + 1) : ~(T)0)
1364fee23f9Smrg
1374d5abbe8Smrg#define __glibcxx_digits_b(T,B)				\
1384d5abbe8Smrg  (B - __glibcxx_signed_b (T,B))
1394fee23f9Smrg
1404fee23f9Smrg// The fraction 643/2136 approximates log10(2) to 7 significant digits.
1414d5abbe8Smrg#define __glibcxx_digits10_b(T,B)		\
1424d5abbe8Smrg  (__glibcxx_digits_b (T,B) * 643L / 2136)
1434d5abbe8Smrg
1444d5abbe8Smrg#define __glibcxx_signed(T) \
1454d5abbe8Smrg  __glibcxx_signed_b (T, sizeof(T) * __CHAR_BIT__)
1464d5abbe8Smrg#define __glibcxx_min(T) \
1474d5abbe8Smrg  __glibcxx_min_b (T, sizeof(T) * __CHAR_BIT__)
1484d5abbe8Smrg#define __glibcxx_max(T) \
1494d5abbe8Smrg  __glibcxx_max_b (T, sizeof(T) * __CHAR_BIT__)
1504d5abbe8Smrg#define __glibcxx_digits(T) \
1514d5abbe8Smrg  __glibcxx_digits_b (T, sizeof(T) * __CHAR_BIT__)
1524fee23f9Smrg#define __glibcxx_digits10(T) \
1534d5abbe8Smrg  __glibcxx_digits10_b (T, sizeof(T) * __CHAR_BIT__)
1544fee23f9Smrg
1554fee23f9Smrg#define __glibcxx_max_digits10(T) \
15648fb7bfaSmrg  (2 + (T) * 643L / 2136)
1574fee23f9Smrg
15848fb7bfaSmrgnamespace std _GLIBCXX_VISIBILITY(default)
15948fb7bfaSmrg{
16048fb7bfaSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
1614fee23f9Smrg
1624fee23f9Smrg  /**
1634fee23f9Smrg   *  @brief Describes the rounding style for floating-point types.
1644fee23f9Smrg   *
1654fee23f9Smrg   *  This is used in the std::numeric_limits class.
1664fee23f9Smrg  */
1674fee23f9Smrg  enum float_round_style
1684fee23f9Smrg  {
16948fb7bfaSmrg    round_indeterminate       = -1,    /// Intermediate.
17048fb7bfaSmrg    round_toward_zero         = 0,     /// To zero.
17148fb7bfaSmrg    round_to_nearest          = 1,     /// To the nearest representable value.
17248fb7bfaSmrg    round_toward_infinity     = 2,     /// To infinity.
17348fb7bfaSmrg    round_toward_neg_infinity = 3      /// To negative infinity.
1744fee23f9Smrg  };
1754fee23f9Smrg
1764fee23f9Smrg  /**
1774fee23f9Smrg   *  @brief Describes the denormalization for floating-point types.
1784fee23f9Smrg   *
1794fee23f9Smrg   *  These values represent the presence or absence of a variable number
1804fee23f9Smrg   *  of exponent bits.  This type is used in the std::numeric_limits class.
1814fee23f9Smrg  */
1824fee23f9Smrg  enum float_denorm_style
1834fee23f9Smrg  {
1844fee23f9Smrg    /// Indeterminate at compile time whether denormalized values are allowed.
1854fee23f9Smrg    denorm_indeterminate = -1,
1864fee23f9Smrg    /// The type does not allow denormalized values.
1874fee23f9Smrg    denorm_absent        = 0,
1884fee23f9Smrg    /// The type allows denormalized values.
1894fee23f9Smrg    denorm_present       = 1
1904fee23f9Smrg  };
1914fee23f9Smrg
1924fee23f9Smrg  /**
1934fee23f9Smrg   *  @brief Part of std::numeric_limits.
1944fee23f9Smrg   *
1954fee23f9Smrg   *  The @c static @c const members are usable as integral constant
1964fee23f9Smrg   *  expressions.
1974fee23f9Smrg   *
1984fee23f9Smrg   *  @note This is a separate class for purposes of efficiency; you
1994fee23f9Smrg   *        should only access these members as part of an instantiation
2004fee23f9Smrg   *        of the std::numeric_limits class.
2014fee23f9Smrg  */
2024fee23f9Smrg  struct __numeric_limits_base
2034fee23f9Smrg  {
2044fee23f9Smrg    /** This will be true for all fundamental types (which have
2054fee23f9Smrg	specializations), and false for everything else.  */
20648fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR bool is_specialized = false;
2074fee23f9Smrg
2084fee23f9Smrg    /** The number of @c radix digits that be represented without change:  for
2094fee23f9Smrg	integer types, the number of non-sign bits in the mantissa; for
2104fee23f9Smrg	floating types, the number of @c radix digits in the mantissa.  */
21148fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR int digits = 0;
21248fb7bfaSmrg
2134fee23f9Smrg    /** The number of base 10 digits that can be represented without change. */
21448fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR int digits10 = 0;
21548fb7bfaSmrg
21648fb7bfaSmrg#if __cplusplus >= 201103L
2174fee23f9Smrg    /** The number of base 10 digits required to ensure that values which
2184fee23f9Smrg	differ are always differentiated.  */
21948fb7bfaSmrg    static constexpr int max_digits10 = 0;
2204fee23f9Smrg#endif
22148fb7bfaSmrg
2224fee23f9Smrg    /** True if the type is signed.  */
22348fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
22448fb7bfaSmrg
22548fb7bfaSmrg    /** True if the type is integer.  */
22648fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR bool is_integer = false;
22748fb7bfaSmrg
22848fb7bfaSmrg    /** True if the type uses an exact representation. All integer types are
2294fee23f9Smrg	exact, but not all exact types are integer.  For example, rational and
23048fb7bfaSmrg	fixed-exponent representations are exact but not integer. */
23148fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR bool is_exact = false;
23248fb7bfaSmrg
2334fee23f9Smrg    /** For integer types, specifies the base of the representation.  For
2344fee23f9Smrg	floating types, specifies the base of the exponent representation.  */
23548fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR int radix = 0;
2364fee23f9Smrg
2374fee23f9Smrg    /** The minimum negative integer such that @c radix raised to the power of
2384fee23f9Smrg	(one less than that integer) is a normalized floating point number.  */
23948fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
24048fb7bfaSmrg
2414fee23f9Smrg    /** The minimum negative integer such that 10 raised to that power is in
2424fee23f9Smrg	the range of normalized floating point numbers.  */
24348fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
24448fb7bfaSmrg
2454fee23f9Smrg    /** The maximum positive integer such that @c radix raised to the power of
2464fee23f9Smrg	(one less than that integer) is a representable finite floating point
2474fee23f9Smrg	number.  */
24848fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
24948fb7bfaSmrg
2504fee23f9Smrg    /** The maximum positive integer such that 10 raised to that power is in
2514fee23f9Smrg	the range of representable finite floating point numbers.  */
25248fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
2534fee23f9Smrg
2544fee23f9Smrg    /** True if the type has a representation for positive infinity.  */
25548fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
25648fb7bfaSmrg
2574fee23f9Smrg    /** True if the type has a representation for a quiet (non-signaling)
25848fb7bfaSmrg	Not a Number.  */
25948fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
26048fb7bfaSmrg
2614fee23f9Smrg    /** True if the type has a representation for a signaling
26248fb7bfaSmrg	Not a Number.  */
26348fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
26448fb7bfaSmrg
2654fee23f9Smrg    /** See std::float_denorm_style for more information.  */
26648fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm = denorm_absent;
26748fb7bfaSmrg
26848fb7bfaSmrg    /** True if loss of accuracy is detected as a denormalization loss,
26948fb7bfaSmrg	rather than as an inexact result. */
27048fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
2714fee23f9Smrg
2724fee23f9Smrg    /** True if-and-only-if the type adheres to the IEC 559 standard, also
2734fee23f9Smrg	known as IEEE 754.  (Only makes sense for floating point types.)  */
27448fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
27548fb7bfaSmrg
27648fb7bfaSmrg    /** True if the set of values representable by the type is
2774fee23f9Smrg	finite.  All built-in types are bounded, this member would be
27848fb7bfaSmrg	false for arbitrary precision types. */
27948fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR bool is_bounded = false;
28048fb7bfaSmrg
28148fb7bfaSmrg    /** True if the type is @e modulo. A type is modulo if, for any
28248fb7bfaSmrg	operation involving +, -, or * on values of that type whose
28348fb7bfaSmrg	result would fall outside the range [min(),max()], the value
28448fb7bfaSmrg	returned differs from the true value by an integer multiple of
28548fb7bfaSmrg	max() - min() + 1. On most machines, this is false for floating
28648fb7bfaSmrg	types, true for unsigned integers, and true for signed integers.
28748fb7bfaSmrg	See PR22200 about signed integers.  */
28848fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
2894fee23f9Smrg
2904fee23f9Smrg    /** True if trapping is implemented for this type.  */
29148fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR bool traps = false;
29248fb7bfaSmrg
2934fee23f9Smrg    /** True if tininess is detected before rounding.  (see IEC 559)  */
29448fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
29548fb7bfaSmrg
2964fee23f9Smrg    /** See std::float_round_style for more information.  This is only
2974fee23f9Smrg	meaningful for floating types; integer types will all be
2984fee23f9Smrg	round_toward_zero.  */
29948fb7bfaSmrg    static _GLIBCXX_USE_CONSTEXPR float_round_style round_style =
30048fb7bfaSmrg						    round_toward_zero;
3014fee23f9Smrg  };
3024fee23f9Smrg
3034fee23f9Smrg  /**
3044fee23f9Smrg   *  @brief Properties of fundamental types.
3054fee23f9Smrg   *
3064fee23f9Smrg   *  This class allows a program to obtain information about the
3074fee23f9Smrg   *  representation of a fundamental type on a given platform.  For
3084fee23f9Smrg   *  non-fundamental types, the functions will return 0 and the data
3094fee23f9Smrg   *  members will all be @c false.
3104fee23f9Smrg  */
3114fee23f9Smrg  template<typename _Tp>
3124fee23f9Smrg    struct numeric_limits : public __numeric_limits_base
3134fee23f9Smrg    {
3144fee23f9Smrg      /** The minimum finite value, or for floating types with
3154fee23f9Smrg	  denormalization, the minimum positive normalized value.  */
31648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR _Tp
31748fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
31848fb7bfaSmrg
3194fee23f9Smrg      /** The maximum finite value.  */
32048fb7bfaSmrg      static _GLIBCXX_CONSTEXPR _Tp
32148fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
32248fb7bfaSmrg
32348fb7bfaSmrg#if __cplusplus >= 201103L
3244fee23f9Smrg      /** A finite value x such that there is no other finite value y
3254fee23f9Smrg       *  where y < x.  */
32648fb7bfaSmrg      static constexpr _Tp
32748fb7bfaSmrg      lowest() noexcept { return _Tp(); }
3284fee23f9Smrg#endif
32948fb7bfaSmrg
3304fee23f9Smrg      /** The @e machine @e epsilon:  the difference between 1 and the least
3314fee23f9Smrg	  value greater than 1 that is representable.  */
33248fb7bfaSmrg      static _GLIBCXX_CONSTEXPR _Tp
33348fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
3344fee23f9Smrg
33548fb7bfaSmrg      /** The maximum rounding error measurement (see LIA-1).  */
33648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR _Tp
33748fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
33848fb7bfaSmrg
33948fb7bfaSmrg      /** The representation of positive infinity, if @c has_infinity.  */
34048fb7bfaSmrg      static _GLIBCXX_CONSTEXPR _Tp
34148fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
34248fb7bfaSmrg
34348fb7bfaSmrg      /** The representation of a quiet Not a Number,
3444fee23f9Smrg	  if @c has_quiet_NaN. */
34548fb7bfaSmrg      static _GLIBCXX_CONSTEXPR _Tp
34648fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
34748fb7bfaSmrg
34848fb7bfaSmrg      /** The representation of a signaling Not a Number, if
3494fee23f9Smrg	  @c has_signaling_NaN. */
35048fb7bfaSmrg      static _GLIBCXX_CONSTEXPR _Tp
35148fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
35248fb7bfaSmrg
3534fee23f9Smrg      /** The minimum positive denormalized value.  For types where
3544fee23f9Smrg	  @c has_denorm is false, this is the minimum positive normalized
3554fee23f9Smrg	  value.  */
35648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR _Tp
35748fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
3584fee23f9Smrg    };
3594fee23f9Smrg
360b17d1066Smrg  // _GLIBCXX_RESOLVE_LIB_DEFECTS
361b17d1066Smrg  // 559. numeric_limits<const T>
362b17d1066Smrg
3634fee23f9Smrg  template<typename _Tp>
3644fee23f9Smrg    struct numeric_limits<const _Tp>
3654fee23f9Smrg    : public numeric_limits<_Tp> { };
3664fee23f9Smrg
3674fee23f9Smrg  template<typename _Tp>
3684fee23f9Smrg    struct numeric_limits<volatile _Tp>
3694fee23f9Smrg    : public numeric_limits<_Tp> { };
3704fee23f9Smrg
3714fee23f9Smrg  template<typename _Tp>
3724fee23f9Smrg    struct numeric_limits<const volatile _Tp>
3734fee23f9Smrg    : public numeric_limits<_Tp> { };
3744fee23f9Smrg
3754fee23f9Smrg  // Now there follow 16 explicit specializations.  Yes, 16.  Make sure
376b17d1066Smrg  // you get the count right. (18 in C++11 mode, with char16_t and char32_t.)
377181254a7Smrg  // (+1 if char8_t is enabled.)
378b17d1066Smrg
379b17d1066Smrg  // _GLIBCXX_RESOLVE_LIB_DEFECTS
380b17d1066Smrg  // 184. numeric_limits<bool> wording problems
3814fee23f9Smrg
3824fee23f9Smrg  /// numeric_limits<bool> specialization.
3834fee23f9Smrg  template<>
3844fee23f9Smrg    struct numeric_limits<bool>
3854fee23f9Smrg    {
38648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
3874fee23f9Smrg
38848fb7bfaSmrg      static _GLIBCXX_CONSTEXPR bool
38948fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return false; }
39048fb7bfaSmrg
39148fb7bfaSmrg      static _GLIBCXX_CONSTEXPR bool
39248fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return true; }
39348fb7bfaSmrg
39448fb7bfaSmrg#if __cplusplus >= 201103L
39548fb7bfaSmrg      static constexpr bool
39648fb7bfaSmrg      lowest() noexcept { return min(); }
3974fee23f9Smrg#endif
39848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits = 1;
39948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10 = 0;
40048fb7bfaSmrg#if __cplusplus >= 201103L
40148fb7bfaSmrg      static constexpr int max_digits10 = 0;
4024fee23f9Smrg#endif
40348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
40448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
40548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
40648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
4074fee23f9Smrg
40848fb7bfaSmrg      static _GLIBCXX_CONSTEXPR bool
40948fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return false; }
4104fee23f9Smrg
41148fb7bfaSmrg      static _GLIBCXX_CONSTEXPR bool
41248fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return false; }
4134fee23f9Smrg
41448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
41548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
41648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
41748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
4184fee23f9Smrg
41948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
42048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
42148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
42248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
42348fb7bfaSmrg       = denorm_absent;
42448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
42548fb7bfaSmrg
42648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR bool
42748fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT { return false; }
42848fb7bfaSmrg
42948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR bool
43048fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return false; }
43148fb7bfaSmrg
43248fb7bfaSmrg      static _GLIBCXX_CONSTEXPR bool
43348fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return false; }
43448fb7bfaSmrg
43548fb7bfaSmrg      static _GLIBCXX_CONSTEXPR bool
43648fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT { return false; }
43748fb7bfaSmrg
43848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
43948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
44048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
4414fee23f9Smrg
4424fee23f9Smrg      // It is not clear what it means for a boolean type to trap.
4434fee23f9Smrg      // This is a DR on the LWG issue list.  Here, I use integer
4444fee23f9Smrg      // promotion semantics.
44548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
44648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
44748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
44848fb7bfaSmrg       = round_toward_zero;
4494fee23f9Smrg    };
4504fee23f9Smrg
4514fee23f9Smrg  /// numeric_limits<char> specialization.
4524fee23f9Smrg  template<>
4534fee23f9Smrg    struct numeric_limits<char>
4544fee23f9Smrg    {
45548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
4564fee23f9Smrg
45748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR char
45848fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_min(char); }
45948fb7bfaSmrg
46048fb7bfaSmrg      static _GLIBCXX_CONSTEXPR char
46148fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_max(char); }
46248fb7bfaSmrg
46348fb7bfaSmrg#if __cplusplus >= 201103L
46448fb7bfaSmrg      static constexpr char
46548fb7bfaSmrg      lowest() noexcept { return min(); }
4664fee23f9Smrg#endif
4674fee23f9Smrg
46848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits = __glibcxx_digits (char);
46948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10 = __glibcxx_digits10 (char);
47048fb7bfaSmrg#if __cplusplus >= 201103L
47148fb7bfaSmrg      static constexpr int max_digits10 = 0;
4724fee23f9Smrg#endif
47348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = __glibcxx_signed (char);
47448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
47548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
47648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
4774fee23f9Smrg
47848fb7bfaSmrg      static _GLIBCXX_CONSTEXPR char
47948fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
4804fee23f9Smrg
48148fb7bfaSmrg      static _GLIBCXX_CONSTEXPR char
48248fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
4834fee23f9Smrg
48448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
48548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
48648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
48748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
4884fee23f9Smrg
48948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
49048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
49148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
49248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
49348fb7bfaSmrg       = denorm_absent;
49448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
4954fee23f9Smrg
49648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR
49748fb7bfaSmrg      char infinity() _GLIBCXX_USE_NOEXCEPT { return char(); }
49848fb7bfaSmrg
49948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR char
50048fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return char(); }
50148fb7bfaSmrg
50248fb7bfaSmrg      static _GLIBCXX_CONSTEXPR char
50348fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return char(); }
50448fb7bfaSmrg
50548fb7bfaSmrg      static _GLIBCXX_CONSTEXPR char
50648fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT { return static_cast<char>(0); }
50748fb7bfaSmrg
50848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
50948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
51048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = !is_signed;
51148fb7bfaSmrg
51248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
51348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
51448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
51548fb7bfaSmrg       = round_toward_zero;
5164fee23f9Smrg    };
5174fee23f9Smrg
5184fee23f9Smrg  /// numeric_limits<signed char> specialization.
5194fee23f9Smrg  template<>
5204fee23f9Smrg    struct numeric_limits<signed char>
5214fee23f9Smrg    {
52248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
5234fee23f9Smrg
52448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR signed char
52548fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return -__SCHAR_MAX__ - 1; }
52648fb7bfaSmrg
52748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR signed char
52848fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __SCHAR_MAX__; }
52948fb7bfaSmrg
53048fb7bfaSmrg#if __cplusplus >= 201103L
53148fb7bfaSmrg      static constexpr signed char
53248fb7bfaSmrg      lowest() noexcept { return min(); }
5334fee23f9Smrg#endif
5344fee23f9Smrg
53548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits = __glibcxx_digits (signed char);
53648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10
53748fb7bfaSmrg       = __glibcxx_digits10 (signed char);
53848fb7bfaSmrg#if __cplusplus >= 201103L
53948fb7bfaSmrg      static constexpr int max_digits10 = 0;
5404fee23f9Smrg#endif
54148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
54248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
54348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
54448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
5454fee23f9Smrg
54648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR signed char
54748fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
5484fee23f9Smrg
54948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR signed char
55048fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
5514fee23f9Smrg
55248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
55348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
55448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
55548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
55648fb7bfaSmrg
55748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
55848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
55948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
56048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
56148fb7bfaSmrg       = denorm_absent;
56248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
56348fb7bfaSmrg
56448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR signed char
56548fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT { return static_cast<signed char>(0); }
56648fb7bfaSmrg
56748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR signed char
56848fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return static_cast<signed char>(0); }
56948fb7bfaSmrg
57048fb7bfaSmrg      static _GLIBCXX_CONSTEXPR signed char
57148fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT
5724fee23f9Smrg      { return static_cast<signed char>(0); }
5734fee23f9Smrg
57448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR signed char
57548fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT
57648fb7bfaSmrg      { return static_cast<signed char>(0); }
5774fee23f9Smrg
57848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
57948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
58048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
58148fb7bfaSmrg
58248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
58348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
58448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
58548fb7bfaSmrg       = round_toward_zero;
5864fee23f9Smrg    };
5874fee23f9Smrg
5884fee23f9Smrg  /// numeric_limits<unsigned char> specialization.
5894fee23f9Smrg  template<>
5904fee23f9Smrg    struct numeric_limits<unsigned char>
5914fee23f9Smrg    {
59248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
5934fee23f9Smrg
59448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned char
59548fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return 0; }
59648fb7bfaSmrg
59748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned char
59848fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __SCHAR_MAX__ * 2U + 1; }
59948fb7bfaSmrg
60048fb7bfaSmrg#if __cplusplus >= 201103L
60148fb7bfaSmrg      static constexpr unsigned char
60248fb7bfaSmrg      lowest() noexcept { return min(); }
6034fee23f9Smrg#endif
6044fee23f9Smrg
60548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits
60648fb7bfaSmrg       = __glibcxx_digits (unsigned char);
60748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10
60848fb7bfaSmrg       = __glibcxx_digits10 (unsigned char);
60948fb7bfaSmrg#if __cplusplus >= 201103L
61048fb7bfaSmrg      static constexpr int max_digits10 = 0;
6114fee23f9Smrg#endif
61248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
61348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
61448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
61548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
6164fee23f9Smrg
61748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned char
61848fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
6194fee23f9Smrg
62048fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned char
62148fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
6224fee23f9Smrg
62348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
62448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
62548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
62648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
62748fb7bfaSmrg
62848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
62948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
63048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
63148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
63248fb7bfaSmrg       = denorm_absent;
63348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
63448fb7bfaSmrg
63548fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned char
63648fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT
6374fee23f9Smrg      { return static_cast<unsigned char>(0); }
6384fee23f9Smrg
63948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned char
64048fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT
64148fb7bfaSmrg      { return static_cast<unsigned char>(0); }
6424fee23f9Smrg
64348fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned char
64448fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT
64548fb7bfaSmrg      { return static_cast<unsigned char>(0); }
64648fb7bfaSmrg
64748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned char
64848fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT
64948fb7bfaSmrg      { return static_cast<unsigned char>(0); }
65048fb7bfaSmrg
65148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
65248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
65348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
65448fb7bfaSmrg
65548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
65648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
65748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
65848fb7bfaSmrg       = round_toward_zero;
6594fee23f9Smrg    };
6604fee23f9Smrg
6614fee23f9Smrg  /// numeric_limits<wchar_t> specialization.
6624fee23f9Smrg  template<>
6634fee23f9Smrg    struct numeric_limits<wchar_t>
6644fee23f9Smrg    {
66548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
6664fee23f9Smrg
66748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR wchar_t
66848fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_min (wchar_t); }
66948fb7bfaSmrg
67048fb7bfaSmrg      static _GLIBCXX_CONSTEXPR wchar_t
67148fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_max (wchar_t); }
67248fb7bfaSmrg
67348fb7bfaSmrg#if __cplusplus >= 201103L
67448fb7bfaSmrg      static constexpr wchar_t
67548fb7bfaSmrg      lowest() noexcept { return min(); }
6764fee23f9Smrg#endif
6774fee23f9Smrg
67848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits = __glibcxx_digits (wchar_t);
67948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10
68048fb7bfaSmrg       = __glibcxx_digits10 (wchar_t);
68148fb7bfaSmrg#if __cplusplus >= 201103L
68248fb7bfaSmrg      static constexpr int max_digits10 = 0;
6834fee23f9Smrg#endif
68448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = __glibcxx_signed (wchar_t);
68548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
68648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
68748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
6884fee23f9Smrg
68948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR wchar_t
69048fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
6914fee23f9Smrg
69248fb7bfaSmrg      static _GLIBCXX_CONSTEXPR wchar_t
69348fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
6944fee23f9Smrg
69548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
69648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
69748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
69848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
6994fee23f9Smrg
70048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
70148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
70248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
70348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
70448fb7bfaSmrg       = denorm_absent;
70548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
7064fee23f9Smrg
70748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR wchar_t
70848fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT { return wchar_t(); }
70948fb7bfaSmrg
71048fb7bfaSmrg      static _GLIBCXX_CONSTEXPR wchar_t
71148fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return wchar_t(); }
71248fb7bfaSmrg
71348fb7bfaSmrg      static _GLIBCXX_CONSTEXPR wchar_t
71448fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return wchar_t(); }
71548fb7bfaSmrg
71648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR wchar_t
71748fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT { return wchar_t(); }
71848fb7bfaSmrg
71948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
72048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
72148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = !is_signed;
72248fb7bfaSmrg
72348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
72448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
72548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
72648fb7bfaSmrg       = round_toward_zero;
7274fee23f9Smrg    };
7284fee23f9Smrg
729181254a7Smrg#if _GLIBCXX_USE_CHAR8_T
730181254a7Smrg  /// numeric_limits<char8_t> specialization.
731181254a7Smrg  template<>
732181254a7Smrg    struct numeric_limits<char8_t>
733181254a7Smrg    {
734181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
735181254a7Smrg
736181254a7Smrg      static _GLIBCXX_CONSTEXPR char8_t
737181254a7Smrg      min() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_min (char8_t); }
738181254a7Smrg
739181254a7Smrg      static _GLIBCXX_CONSTEXPR char8_t
740181254a7Smrg      max() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_max (char8_t); }
741181254a7Smrg
742181254a7Smrg      static _GLIBCXX_CONSTEXPR char8_t
743181254a7Smrg      lowest() _GLIBCXX_USE_NOEXCEPT { return min(); }
744181254a7Smrg
745181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR int digits = __glibcxx_digits (char8_t);
746181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR int digits10 = __glibcxx_digits10 (char8_t);
747181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR int max_digits10 = 0;
748181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = __glibcxx_signed (char8_t);
749181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
750181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
751181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
752181254a7Smrg
753181254a7Smrg      static _GLIBCXX_CONSTEXPR char8_t
754181254a7Smrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
755181254a7Smrg
756181254a7Smrg      static _GLIBCXX_CONSTEXPR char8_t
757181254a7Smrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
758181254a7Smrg
759181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
760181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
761181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
762181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
763181254a7Smrg
764181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
765181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
766181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
767181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
768181254a7Smrg	= denorm_absent;
769181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
770181254a7Smrg
771181254a7Smrg      static _GLIBCXX_CONSTEXPR char8_t
772181254a7Smrg      infinity() _GLIBCXX_USE_NOEXCEPT { return char8_t(); }
773181254a7Smrg
774181254a7Smrg      static _GLIBCXX_CONSTEXPR char8_t
775181254a7Smrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return char8_t(); }
776181254a7Smrg
777181254a7Smrg      static _GLIBCXX_CONSTEXPR char8_t
778181254a7Smrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return char8_t(); }
779181254a7Smrg
780181254a7Smrg      static _GLIBCXX_CONSTEXPR char8_t
781181254a7Smrg      denorm_min() _GLIBCXX_USE_NOEXCEPT { return char8_t(); }
782181254a7Smrg
783181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
784181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
785181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = !is_signed;
786181254a7Smrg
787181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
788181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
789181254a7Smrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
790181254a7Smrg	= round_toward_zero;
791181254a7Smrg    };
792181254a7Smrg#endif
793181254a7Smrg
79448fb7bfaSmrg#if __cplusplus >= 201103L
7954fee23f9Smrg  /// numeric_limits<char16_t> specialization.
7964fee23f9Smrg  template<>
7974fee23f9Smrg    struct numeric_limits<char16_t>
7984fee23f9Smrg    {
79948fb7bfaSmrg      static constexpr bool is_specialized = true;
8004fee23f9Smrg
80148fb7bfaSmrg      static constexpr char16_t
80248fb7bfaSmrg      min() noexcept { return __glibcxx_min (char16_t); }
8034fee23f9Smrg
80448fb7bfaSmrg      static constexpr char16_t
80548fb7bfaSmrg      max() noexcept { return __glibcxx_max (char16_t); }
8064fee23f9Smrg
80748fb7bfaSmrg      static constexpr char16_t
80848fb7bfaSmrg      lowest() noexcept { return min(); }
8094fee23f9Smrg
81048fb7bfaSmrg      static constexpr int digits = __glibcxx_digits (char16_t);
81148fb7bfaSmrg      static constexpr int digits10 = __glibcxx_digits10 (char16_t);
81248fb7bfaSmrg      static constexpr int max_digits10 = 0;
81348fb7bfaSmrg      static constexpr bool is_signed = __glibcxx_signed (char16_t);
81448fb7bfaSmrg      static constexpr bool is_integer = true;
81548fb7bfaSmrg      static constexpr bool is_exact = true;
81648fb7bfaSmrg      static constexpr int radix = 2;
8174fee23f9Smrg
81848fb7bfaSmrg      static constexpr char16_t
81948fb7bfaSmrg      epsilon() noexcept { return 0; }
8204fee23f9Smrg
82148fb7bfaSmrg      static constexpr char16_t
82248fb7bfaSmrg      round_error() noexcept { return 0; }
8234fee23f9Smrg
82448fb7bfaSmrg      static constexpr int min_exponent = 0;
82548fb7bfaSmrg      static constexpr int min_exponent10 = 0;
82648fb7bfaSmrg      static constexpr int max_exponent = 0;
82748fb7bfaSmrg      static constexpr int max_exponent10 = 0;
82848fb7bfaSmrg
82948fb7bfaSmrg      static constexpr bool has_infinity = false;
83048fb7bfaSmrg      static constexpr bool has_quiet_NaN = false;
83148fb7bfaSmrg      static constexpr bool has_signaling_NaN = false;
83248fb7bfaSmrg      static constexpr float_denorm_style has_denorm = denorm_absent;
83348fb7bfaSmrg      static constexpr bool has_denorm_loss = false;
83448fb7bfaSmrg
83548fb7bfaSmrg      static constexpr char16_t
83648fb7bfaSmrg      infinity() noexcept { return char16_t(); }
83748fb7bfaSmrg
83848fb7bfaSmrg      static constexpr char16_t
83948fb7bfaSmrg      quiet_NaN() noexcept { return char16_t(); }
84048fb7bfaSmrg
84148fb7bfaSmrg      static constexpr char16_t
84248fb7bfaSmrg      signaling_NaN() noexcept { return char16_t(); }
84348fb7bfaSmrg
84448fb7bfaSmrg      static constexpr char16_t
84548fb7bfaSmrg      denorm_min() noexcept { return char16_t(); }
84648fb7bfaSmrg
84748fb7bfaSmrg      static constexpr bool is_iec559 = false;
84848fb7bfaSmrg      static constexpr bool is_bounded = true;
84948fb7bfaSmrg      static constexpr bool is_modulo = !is_signed;
85048fb7bfaSmrg
85148fb7bfaSmrg      static constexpr bool traps = __glibcxx_integral_traps;
85248fb7bfaSmrg      static constexpr bool tinyness_before = false;
85348fb7bfaSmrg      static constexpr float_round_style round_style = round_toward_zero;
8544fee23f9Smrg    };
8554fee23f9Smrg
8564fee23f9Smrg  /// numeric_limits<char32_t> specialization.
8574fee23f9Smrg  template<>
8584fee23f9Smrg    struct numeric_limits<char32_t>
8594fee23f9Smrg    {
86048fb7bfaSmrg      static constexpr bool is_specialized = true;
8614fee23f9Smrg
86248fb7bfaSmrg      static constexpr char32_t
86348fb7bfaSmrg      min() noexcept { return __glibcxx_min (char32_t); }
8644fee23f9Smrg
86548fb7bfaSmrg      static constexpr char32_t
86648fb7bfaSmrg      max() noexcept { return __glibcxx_max (char32_t); }
8674fee23f9Smrg
86848fb7bfaSmrg      static constexpr char32_t
86948fb7bfaSmrg      lowest() noexcept { return min(); }
8704fee23f9Smrg
87148fb7bfaSmrg      static constexpr int digits = __glibcxx_digits (char32_t);
87248fb7bfaSmrg      static constexpr int digits10 = __glibcxx_digits10 (char32_t);
87348fb7bfaSmrg      static constexpr int max_digits10 = 0;
87448fb7bfaSmrg      static constexpr bool is_signed = __glibcxx_signed (char32_t);
87548fb7bfaSmrg      static constexpr bool is_integer = true;
87648fb7bfaSmrg      static constexpr bool is_exact = true;
87748fb7bfaSmrg      static constexpr int radix = 2;
8784fee23f9Smrg
87948fb7bfaSmrg      static constexpr char32_t
88048fb7bfaSmrg      epsilon() noexcept { return 0; }
8814fee23f9Smrg
88248fb7bfaSmrg      static constexpr char32_t
88348fb7bfaSmrg      round_error() noexcept { return 0; }
8844fee23f9Smrg
88548fb7bfaSmrg      static constexpr int min_exponent = 0;
88648fb7bfaSmrg      static constexpr int min_exponent10 = 0;
88748fb7bfaSmrg      static constexpr int max_exponent = 0;
88848fb7bfaSmrg      static constexpr int max_exponent10 = 0;
88948fb7bfaSmrg
89048fb7bfaSmrg      static constexpr bool has_infinity = false;
89148fb7bfaSmrg      static constexpr bool has_quiet_NaN = false;
89248fb7bfaSmrg      static constexpr bool has_signaling_NaN = false;
89348fb7bfaSmrg      static constexpr float_denorm_style has_denorm = denorm_absent;
89448fb7bfaSmrg      static constexpr bool has_denorm_loss = false;
89548fb7bfaSmrg
89648fb7bfaSmrg      static constexpr char32_t
89748fb7bfaSmrg      infinity() noexcept { return char32_t(); }
89848fb7bfaSmrg
89948fb7bfaSmrg      static constexpr char32_t
90048fb7bfaSmrg      quiet_NaN() noexcept { return char32_t(); }
90148fb7bfaSmrg
90248fb7bfaSmrg      static constexpr char32_t
90348fb7bfaSmrg      signaling_NaN() noexcept { return char32_t(); }
90448fb7bfaSmrg
90548fb7bfaSmrg      static constexpr char32_t
90648fb7bfaSmrg      denorm_min() noexcept { return char32_t(); }
90748fb7bfaSmrg
90848fb7bfaSmrg      static constexpr bool is_iec559 = false;
90948fb7bfaSmrg      static constexpr bool is_bounded = true;
91048fb7bfaSmrg      static constexpr bool is_modulo = !is_signed;
91148fb7bfaSmrg
91248fb7bfaSmrg      static constexpr bool traps = __glibcxx_integral_traps;
91348fb7bfaSmrg      static constexpr bool tinyness_before = false;
91448fb7bfaSmrg      static constexpr float_round_style round_style = round_toward_zero;
9154fee23f9Smrg    };
9164fee23f9Smrg#endif
9174fee23f9Smrg
9184fee23f9Smrg  /// numeric_limits<short> specialization.
9194fee23f9Smrg  template<>
9204fee23f9Smrg    struct numeric_limits<short>
9214fee23f9Smrg    {
92248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
9234fee23f9Smrg
92448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR short
92548fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return -__SHRT_MAX__ - 1; }
92648fb7bfaSmrg
92748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR short
92848fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __SHRT_MAX__; }
92948fb7bfaSmrg
93048fb7bfaSmrg#if __cplusplus >= 201103L
93148fb7bfaSmrg      static constexpr short
93248fb7bfaSmrg      lowest() noexcept { return min(); }
9334fee23f9Smrg#endif
9344fee23f9Smrg
93548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits = __glibcxx_digits (short);
93648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10 = __glibcxx_digits10 (short);
93748fb7bfaSmrg#if __cplusplus >= 201103L
93848fb7bfaSmrg      static constexpr int max_digits10 = 0;
9394fee23f9Smrg#endif
94048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
94148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
94248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
94348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
9444fee23f9Smrg
94548fb7bfaSmrg      static _GLIBCXX_CONSTEXPR short
94648fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
9474fee23f9Smrg
94848fb7bfaSmrg      static _GLIBCXX_CONSTEXPR short
94948fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
9504fee23f9Smrg
95148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
95248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
95348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
95448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
9554fee23f9Smrg
95648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
95748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
95848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
95948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
96048fb7bfaSmrg       = denorm_absent;
96148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
9624fee23f9Smrg
96348fb7bfaSmrg      static _GLIBCXX_CONSTEXPR short
96448fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT { return short(); }
96548fb7bfaSmrg
96648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR short
96748fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return short(); }
96848fb7bfaSmrg
96948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR short
97048fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return short(); }
97148fb7bfaSmrg
97248fb7bfaSmrg      static _GLIBCXX_CONSTEXPR short
97348fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT { return short(); }
97448fb7bfaSmrg
97548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
97648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
97748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
97848fb7bfaSmrg
97948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
98048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
98148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
98248fb7bfaSmrg       = round_toward_zero;
9834fee23f9Smrg    };
9844fee23f9Smrg
9854fee23f9Smrg  /// numeric_limits<unsigned short> specialization.
9864fee23f9Smrg  template<>
9874fee23f9Smrg    struct numeric_limits<unsigned short>
9884fee23f9Smrg    {
98948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
9904fee23f9Smrg
99148fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned short
99248fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return 0; }
99348fb7bfaSmrg
99448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned short
99548fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __SHRT_MAX__ * 2U + 1; }
99648fb7bfaSmrg
99748fb7bfaSmrg#if __cplusplus >= 201103L
99848fb7bfaSmrg      static constexpr unsigned short
99948fb7bfaSmrg      lowest() noexcept { return min(); }
10004fee23f9Smrg#endif
10014fee23f9Smrg
100248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits
100348fb7bfaSmrg       = __glibcxx_digits (unsigned short);
100448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10
100548fb7bfaSmrg       = __glibcxx_digits10 (unsigned short);
100648fb7bfaSmrg#if __cplusplus >= 201103L
100748fb7bfaSmrg      static constexpr int max_digits10 = 0;
10084fee23f9Smrg#endif
100948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
101048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
101148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
101248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
10134fee23f9Smrg
101448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned short
101548fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
10164fee23f9Smrg
101748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned short
101848fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
10194fee23f9Smrg
102048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
102148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
102248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
102348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
102448fb7bfaSmrg
102548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
102648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
102748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
102848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
102948fb7bfaSmrg       = denorm_absent;
103048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
103148fb7bfaSmrg
103248fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned short
103348fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT
10344fee23f9Smrg      { return static_cast<unsigned short>(0); }
10354fee23f9Smrg
103648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned short
103748fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT
103848fb7bfaSmrg      { return static_cast<unsigned short>(0); }
10394fee23f9Smrg
104048fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned short
104148fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT
104248fb7bfaSmrg      { return static_cast<unsigned short>(0); }
104348fb7bfaSmrg
104448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned short
104548fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT
104648fb7bfaSmrg      { return static_cast<unsigned short>(0); }
104748fb7bfaSmrg
104848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
104948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
105048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
105148fb7bfaSmrg
105248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
105348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
105448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
105548fb7bfaSmrg       = round_toward_zero;
10564fee23f9Smrg    };
10574fee23f9Smrg
10584fee23f9Smrg  /// numeric_limits<int> specialization.
10594fee23f9Smrg  template<>
10604fee23f9Smrg    struct numeric_limits<int>
10614fee23f9Smrg    {
106248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
10634fee23f9Smrg
106448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR int
106548fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return -__INT_MAX__ - 1; }
106648fb7bfaSmrg
106748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR int
106848fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __INT_MAX__; }
106948fb7bfaSmrg
107048fb7bfaSmrg#if __cplusplus >= 201103L
107148fb7bfaSmrg      static constexpr int
107248fb7bfaSmrg      lowest() noexcept { return min(); }
10734fee23f9Smrg#endif
10744fee23f9Smrg
107548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits = __glibcxx_digits (int);
107648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10 = __glibcxx_digits10 (int);
107748fb7bfaSmrg#if __cplusplus >= 201103L
107848fb7bfaSmrg      static constexpr int max_digits10 = 0;
10794fee23f9Smrg#endif
108048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
108148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
108248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
108348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
10844fee23f9Smrg
108548fb7bfaSmrg      static _GLIBCXX_CONSTEXPR int
108648fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
10874fee23f9Smrg
108848fb7bfaSmrg      static _GLIBCXX_CONSTEXPR int
108948fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
10904fee23f9Smrg
109148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
109248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
109348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
109448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
10954fee23f9Smrg
109648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
109748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
109848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
109948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
110048fb7bfaSmrg       = denorm_absent;
110148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
11024fee23f9Smrg
110348fb7bfaSmrg      static _GLIBCXX_CONSTEXPR int
110448fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT { return static_cast<int>(0); }
110548fb7bfaSmrg
110648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR int
110748fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return static_cast<int>(0); }
110848fb7bfaSmrg
110948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR int
111048fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return static_cast<int>(0); }
111148fb7bfaSmrg
111248fb7bfaSmrg      static _GLIBCXX_CONSTEXPR int
111348fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT { return static_cast<int>(0); }
111448fb7bfaSmrg
111548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
111648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
111748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
111848fb7bfaSmrg
111948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
112048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
112148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
112248fb7bfaSmrg       = round_toward_zero;
11234fee23f9Smrg    };
11244fee23f9Smrg
11254fee23f9Smrg  /// numeric_limits<unsigned int> specialization.
11264fee23f9Smrg  template<>
11274fee23f9Smrg    struct numeric_limits<unsigned int>
11284fee23f9Smrg    {
112948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
11304fee23f9Smrg
113148fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned int
113248fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return 0; }
113348fb7bfaSmrg
113448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned int
113548fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __INT_MAX__ * 2U + 1; }
113648fb7bfaSmrg
113748fb7bfaSmrg#if __cplusplus >= 201103L
113848fb7bfaSmrg      static constexpr unsigned int
113948fb7bfaSmrg      lowest() noexcept { return min(); }
11404fee23f9Smrg#endif
11414fee23f9Smrg
114248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits
114348fb7bfaSmrg       = __glibcxx_digits (unsigned int);
114448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10
114548fb7bfaSmrg       = __glibcxx_digits10 (unsigned int);
114648fb7bfaSmrg#if __cplusplus >= 201103L
114748fb7bfaSmrg      static constexpr int max_digits10 = 0;
11484fee23f9Smrg#endif
114948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
115048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
115148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
115248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
11534fee23f9Smrg
115448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned int
115548fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
11564fee23f9Smrg
115748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned int
115848fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
11594fee23f9Smrg
116048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
116148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
116248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
116348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
116448fb7bfaSmrg
116548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
116648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
116748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
116848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
116948fb7bfaSmrg       = denorm_absent;
117048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
117148fb7bfaSmrg
117248fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned int
117348fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT { return static_cast<unsigned int>(0); }
117448fb7bfaSmrg
117548fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned int
117648fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT
11774fee23f9Smrg      { return static_cast<unsigned int>(0); }
11784fee23f9Smrg
117948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned int
118048fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT
118148fb7bfaSmrg      { return static_cast<unsigned int>(0); }
11824fee23f9Smrg
118348fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned int
118448fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT
118548fb7bfaSmrg      { return static_cast<unsigned int>(0); }
118648fb7bfaSmrg
118748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
118848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
118948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
119048fb7bfaSmrg
119148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
119248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
119348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
119448fb7bfaSmrg       = round_toward_zero;
11954fee23f9Smrg    };
11964fee23f9Smrg
11974fee23f9Smrg  /// numeric_limits<long> specialization.
11984fee23f9Smrg  template<>
11994fee23f9Smrg    struct numeric_limits<long>
12004fee23f9Smrg    {
120148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
12024fee23f9Smrg
120348fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long
120448fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return -__LONG_MAX__ - 1; }
120548fb7bfaSmrg
120648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long
120748fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __LONG_MAX__; }
120848fb7bfaSmrg
120948fb7bfaSmrg#if __cplusplus >= 201103L
121048fb7bfaSmrg      static constexpr long
121148fb7bfaSmrg      lowest() noexcept { return min(); }
12124fee23f9Smrg#endif
12134fee23f9Smrg
121448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits = __glibcxx_digits (long);
121548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10 = __glibcxx_digits10 (long);
121648fb7bfaSmrg#if __cplusplus >= 201103L
121748fb7bfaSmrg      static constexpr int max_digits10 = 0;
12184fee23f9Smrg#endif
121948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
122048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
122148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
122248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
12234fee23f9Smrg
122448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long
122548fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
12264fee23f9Smrg
122748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long
122848fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
12294fee23f9Smrg
123048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
123148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
123248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
123348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
12344fee23f9Smrg
123548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
123648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
123748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
123848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
123948fb7bfaSmrg       = denorm_absent;
124048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
12414fee23f9Smrg
124248fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long
124348fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT { return static_cast<long>(0); }
124448fb7bfaSmrg
124548fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long
124648fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return static_cast<long>(0); }
124748fb7bfaSmrg
124848fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long
124948fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return static_cast<long>(0); }
125048fb7bfaSmrg
125148fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long
125248fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT { return static_cast<long>(0); }
125348fb7bfaSmrg
125448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
125548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
125648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
125748fb7bfaSmrg
125848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
125948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
126048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
126148fb7bfaSmrg       = round_toward_zero;
12624fee23f9Smrg    };
12634fee23f9Smrg
12644fee23f9Smrg  /// numeric_limits<unsigned long> specialization.
12654fee23f9Smrg  template<>
12664fee23f9Smrg    struct numeric_limits<unsigned long>
12674fee23f9Smrg    {
126848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
12694fee23f9Smrg
127048fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long
127148fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return 0; }
127248fb7bfaSmrg
127348fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long
127448fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __LONG_MAX__ * 2UL + 1; }
127548fb7bfaSmrg
127648fb7bfaSmrg#if __cplusplus >= 201103L
127748fb7bfaSmrg      static constexpr unsigned long
127848fb7bfaSmrg      lowest() noexcept { return min(); }
12794fee23f9Smrg#endif
12804fee23f9Smrg
128148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits
128248fb7bfaSmrg       = __glibcxx_digits (unsigned long);
128348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10
128448fb7bfaSmrg       = __glibcxx_digits10 (unsigned long);
128548fb7bfaSmrg#if __cplusplus >= 201103L
128648fb7bfaSmrg      static constexpr int max_digits10 = 0;
12874fee23f9Smrg#endif
128848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
128948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
129048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
129148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
12924fee23f9Smrg
129348fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long
129448fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
12954fee23f9Smrg
129648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long
129748fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
12984fee23f9Smrg
129948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
130048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
130148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
130248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
130348fb7bfaSmrg
130448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
130548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
130648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
130748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
130848fb7bfaSmrg       = denorm_absent;
130948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
131048fb7bfaSmrg
131148fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long
131248fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT
13134fee23f9Smrg      { return static_cast<unsigned long>(0); }
13144fee23f9Smrg
131548fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long
131648fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT
131748fb7bfaSmrg      { return static_cast<unsigned long>(0); }
13184fee23f9Smrg
131948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long
132048fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT
132148fb7bfaSmrg      { return static_cast<unsigned long>(0); }
132248fb7bfaSmrg
132348fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long
132448fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT
132548fb7bfaSmrg      { return static_cast<unsigned long>(0); }
132648fb7bfaSmrg
132748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
132848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
132948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
133048fb7bfaSmrg
133148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
133248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
133348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
133448fb7bfaSmrg       = round_toward_zero;
13354fee23f9Smrg    };
13364fee23f9Smrg
13374fee23f9Smrg  /// numeric_limits<long long> specialization.
13384fee23f9Smrg  template<>
13394fee23f9Smrg    struct numeric_limits<long long>
13404fee23f9Smrg    {
134148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
13424fee23f9Smrg
134348fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long long
134448fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return -__LONG_LONG_MAX__ - 1; }
134548fb7bfaSmrg
134648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long long
134748fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__; }
134848fb7bfaSmrg
134948fb7bfaSmrg#if __cplusplus >= 201103L
135048fb7bfaSmrg      static constexpr long long
135148fb7bfaSmrg      lowest() noexcept { return min(); }
13524fee23f9Smrg#endif
13534fee23f9Smrg
135448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits
135548fb7bfaSmrg       = __glibcxx_digits (long long);
135648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10
135748fb7bfaSmrg       = __glibcxx_digits10 (long long);
135848fb7bfaSmrg#if __cplusplus >= 201103L
135948fb7bfaSmrg      static constexpr int max_digits10 = 0;
13604fee23f9Smrg#endif
136148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
136248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
136348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
136448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
13654fee23f9Smrg
136648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long long
136748fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
13684fee23f9Smrg
136948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long long
137048fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
13714fee23f9Smrg
137248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
137348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
137448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
137548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
137648fb7bfaSmrg
137748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
137848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
137948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
138048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
138148fb7bfaSmrg       = denorm_absent;
138248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
138348fb7bfaSmrg
138448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long long
138548fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT { return static_cast<long long>(0); }
138648fb7bfaSmrg
138748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long long
138848fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return static_cast<long long>(0); }
138948fb7bfaSmrg
139048fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long long
139148fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT
13924fee23f9Smrg      { return static_cast<long long>(0); }
13934fee23f9Smrg
139448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long long
139548fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT { return static_cast<long long>(0); }
13964fee23f9Smrg
139748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
139848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
139948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
140048fb7bfaSmrg
140148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
140248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
140348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
140448fb7bfaSmrg       = round_toward_zero;
14054fee23f9Smrg    };
14064fee23f9Smrg
14074fee23f9Smrg  /// numeric_limits<unsigned long long> specialization.
14084fee23f9Smrg  template<>
14094fee23f9Smrg    struct numeric_limits<unsigned long long>
14104fee23f9Smrg    {
141148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
14124fee23f9Smrg
141348fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long long
141448fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return 0; }
141548fb7bfaSmrg
141648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long long
141748fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__ * 2ULL + 1; }
141848fb7bfaSmrg
141948fb7bfaSmrg#if __cplusplus >= 201103L
142048fb7bfaSmrg      static constexpr unsigned long long
142148fb7bfaSmrg      lowest() noexcept { return min(); }
14224fee23f9Smrg#endif
14234fee23f9Smrg
142448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits
142548fb7bfaSmrg       = __glibcxx_digits (unsigned long long);
142648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10
142748fb7bfaSmrg       = __glibcxx_digits10 (unsigned long long);
142848fb7bfaSmrg#if __cplusplus >= 201103L
142948fb7bfaSmrg      static constexpr int max_digits10 = 0;
14304fee23f9Smrg#endif
143148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
143248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
143348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
143448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
14354fee23f9Smrg
143648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long long
143748fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
14384fee23f9Smrg
143948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long long
144048fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
14414fee23f9Smrg
144248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
144348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
144448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
144548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
144648fb7bfaSmrg
144748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
144848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
144948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
145048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
145148fb7bfaSmrg       = denorm_absent;
145248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
145348fb7bfaSmrg
145448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long long
145548fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT
14564fee23f9Smrg      { return static_cast<unsigned long long>(0); }
14574fee23f9Smrg
145848fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long long
145948fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT
146048fb7bfaSmrg      { return static_cast<unsigned long long>(0); }
14614fee23f9Smrg
146248fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long long
146348fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT
146448fb7bfaSmrg      { return static_cast<unsigned long long>(0); }
146548fb7bfaSmrg
146648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR unsigned long long
146748fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT
146848fb7bfaSmrg      { return static_cast<unsigned long long>(0); }
146948fb7bfaSmrg
147048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
147148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
147248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
147348fb7bfaSmrg
147448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
147548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
147648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
147748fb7bfaSmrg       = round_toward_zero;
14784fee23f9Smrg    };
14794fee23f9Smrg
14804d5abbe8Smrg#define __INT_N(TYPE, BITSIZE, EXT, UEXT)				\
1481*b1e83836Smrg  __extension__								\
14824d5abbe8Smrg  template<>								\
14834d5abbe8Smrg    struct numeric_limits<TYPE>						\
14844d5abbe8Smrg    {									\
14854d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;		\
14864d5abbe8Smrg									\
14874d5abbe8Smrg      static _GLIBCXX_CONSTEXPR TYPE					\
14884d5abbe8Smrg      min() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_min_b (TYPE, BITSIZE); } \
14894d5abbe8Smrg									\
14904d5abbe8Smrg      static _GLIBCXX_CONSTEXPR TYPE					\
14914d5abbe8Smrg      max() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_max_b (TYPE, BITSIZE); } \
14924d5abbe8Smrg									\
14934d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR int digits				\
14944d5abbe8Smrg	= BITSIZE - 1;							\
14954d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR int digits10			\
14964d5abbe8Smrg	= (BITSIZE - 1) * 643L / 2136;					\
14974d5abbe8Smrg									\
14984d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;		\
14994d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;		\
15004d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;		\
15014d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;			\
15024d5abbe8Smrg									\
15034d5abbe8Smrg      static _GLIBCXX_CONSTEXPR TYPE					\
15044d5abbe8Smrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }			\
15054d5abbe8Smrg									\
15064d5abbe8Smrg      static _GLIBCXX_CONSTEXPR TYPE 					\
15074d5abbe8Smrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }			\
15084d5abbe8Smrg									\
15094d5abbe8Smrg      EXT								\
15104d5abbe8Smrg									\
15114d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;		\
15124d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;		\
15134d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;		\
15144d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;		\
15154d5abbe8Smrg									\
15164d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;		\
15174d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;		\
15184d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;	\
15194d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm	\
15204d5abbe8Smrg	= denorm_absent;						\
15214d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;	\
15224d5abbe8Smrg									\
15234d5abbe8Smrg      static _GLIBCXX_CONSTEXPR TYPE					\
15244d5abbe8Smrg      infinity() _GLIBCXX_USE_NOEXCEPT					\
15254d5abbe8Smrg      { return static_cast<TYPE>(0); }					\
15264d5abbe8Smrg									\
15274d5abbe8Smrg      static _GLIBCXX_CONSTEXPR TYPE					\
15284d5abbe8Smrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT					\
15294d5abbe8Smrg      { return static_cast<TYPE>(0); }					\
15304d5abbe8Smrg									\
15314d5abbe8Smrg      static _GLIBCXX_CONSTEXPR TYPE					\
15324d5abbe8Smrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT				\
15334d5abbe8Smrg      { return static_cast<TYPE>(0); }					\
15344d5abbe8Smrg									\
15354d5abbe8Smrg      static _GLIBCXX_CONSTEXPR TYPE					\
15364d5abbe8Smrg      denorm_min() _GLIBCXX_USE_NOEXCEPT				\
15374d5abbe8Smrg      { return static_cast<TYPE>(0); }					\
15384d5abbe8Smrg									\
15394d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false; 		\
15404d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true; 		\
15414d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false; 		\
15424d5abbe8Smrg									\
15434d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool traps 				\
15444d5abbe8Smrg	= __glibcxx_integral_traps; 					\
15454d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false; 	\
15464d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style 	\
15474d5abbe8Smrg	= round_toward_zero; 						\
15484d5abbe8Smrg    }; 									\
15494d5abbe8Smrg									\
1550*b1e83836Smrg  __extension__								\
15514d5abbe8Smrg  template<>								\
15524d5abbe8Smrg    struct numeric_limits<unsigned TYPE>				\
15534d5abbe8Smrg    {									\
15544d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;		\
15554d5abbe8Smrg									\
15564d5abbe8Smrg      static _GLIBCXX_CONSTEXPR unsigned TYPE				\
15574d5abbe8Smrg      min() _GLIBCXX_USE_NOEXCEPT { return 0; }				\
15584d5abbe8Smrg									\
15594d5abbe8Smrg      static _GLIBCXX_CONSTEXPR unsigned TYPE				\
15604d5abbe8Smrg      max() _GLIBCXX_USE_NOEXCEPT					\
15614d5abbe8Smrg      { return  __glibcxx_max_b (unsigned TYPE, BITSIZE); }		\
15624d5abbe8Smrg									\
15634d5abbe8Smrg      UEXT								\
15644d5abbe8Smrg									\
15654d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR int digits				\
15664d5abbe8Smrg	= BITSIZE;							\
15674d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR int digits10			\
15684d5abbe8Smrg	= BITSIZE * 643L / 2136; 					\
15694d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;		\
15704d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;		\
15714d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;		\
15724d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR int radix = 2;			\
15734d5abbe8Smrg									\
15744d5abbe8Smrg      static _GLIBCXX_CONSTEXPR unsigned TYPE 				\
15754d5abbe8Smrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }			\
15764d5abbe8Smrg									\
15774d5abbe8Smrg      static _GLIBCXX_CONSTEXPR unsigned TYPE				\
15784d5abbe8Smrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }			\
15794d5abbe8Smrg									\
15804d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;		\
15814d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;		\
15824d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0; 		\
15834d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;		\
15844d5abbe8Smrg									\
15854d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;		\
15864d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;		\
15874d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;	\
15884d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm	\
15894d5abbe8Smrg       = denorm_absent; 						\
15904d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;	\
15914d5abbe8Smrg									\
15924d5abbe8Smrg      static _GLIBCXX_CONSTEXPR unsigned TYPE 				\
15934d5abbe8Smrg      infinity() _GLIBCXX_USE_NOEXCEPT 					\
15944d5abbe8Smrg      { return static_cast<unsigned TYPE>(0); }				\
15954d5abbe8Smrg									\
15964d5abbe8Smrg      static _GLIBCXX_CONSTEXPR unsigned TYPE				\
15974d5abbe8Smrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT 				\
15984d5abbe8Smrg      { return static_cast<unsigned TYPE>(0); }				\
15994d5abbe8Smrg									\
16004d5abbe8Smrg      static _GLIBCXX_CONSTEXPR unsigned TYPE				\
16014d5abbe8Smrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT				\
16024d5abbe8Smrg      { return static_cast<unsigned TYPE>(0); }				\
16034d5abbe8Smrg									\
16044d5abbe8Smrg      static _GLIBCXX_CONSTEXPR unsigned TYPE 				\
16054d5abbe8Smrg      denorm_min() _GLIBCXX_USE_NOEXCEPT				\
16064d5abbe8Smrg      { return static_cast<unsigned TYPE>(0); }				\
16074d5abbe8Smrg									\
16084d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;		\
16094d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;		\
16104d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;		\
16114d5abbe8Smrg									\
16124d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps; \
16134d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;	\
16144d5abbe8Smrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style	\
16154d5abbe8Smrg	= round_toward_zero;						\
161648fb7bfaSmrg    };
161748fb7bfaSmrg
161848fb7bfaSmrg#if __cplusplus >= 201103L
161948fb7bfaSmrg
16204d5abbe8Smrg#define __INT_N_201103(TYPE)						\
16214d5abbe8Smrg      static constexpr TYPE 						\
16224d5abbe8Smrg      lowest() noexcept { return min(); }				\
162348fb7bfaSmrg      static constexpr int max_digits10 = 0;
16244d5abbe8Smrg
16254d5abbe8Smrg#define __INT_N_U201103(TYPE)						\
16264d5abbe8Smrg      static constexpr unsigned TYPE  					\
16274d5abbe8Smrg      lowest() noexcept { return min(); }				\
16284d5abbe8Smrg      static constexpr int max_digits10 = 0;
16294d5abbe8Smrg
16304d5abbe8Smrg#else
16314d5abbe8Smrg#define __INT_N_201103(TYPE)
16324d5abbe8Smrg#define __INT_N_U201103(TYPE)
163348fb7bfaSmrg#endif
163448fb7bfaSmrg
1635fb8a8121Smrg#if !defined(__STRICT_ANSI__)
16364d5abbe8Smrg#ifdef __GLIBCXX_TYPE_INT_N_0
16374d5abbe8Smrg  __INT_N(__GLIBCXX_TYPE_INT_N_0, __GLIBCXX_BITSIZE_INT_N_0,
1638*b1e83836Smrg	  __INT_N_201103 (__GLIBCXX_TYPE_INT_N_0),
1639*b1e83836Smrg	  __INT_N_U201103 (__GLIBCXX_TYPE_INT_N_0))
16404d5abbe8Smrg#endif
16414d5abbe8Smrg#ifdef __GLIBCXX_TYPE_INT_N_1
16424d5abbe8Smrg  __INT_N (__GLIBCXX_TYPE_INT_N_1, __GLIBCXX_BITSIZE_INT_N_1,
1643*b1e83836Smrg	  __INT_N_201103 (__GLIBCXX_TYPE_INT_N_1),
1644*b1e83836Smrg	  __INT_N_U201103 (__GLIBCXX_TYPE_INT_N_1))
16454d5abbe8Smrg#endif
16464d5abbe8Smrg#ifdef __GLIBCXX_TYPE_INT_N_2
16474d5abbe8Smrg  __INT_N (__GLIBCXX_TYPE_INT_N_2, __GLIBCXX_BITSIZE_INT_N_2,
1648*b1e83836Smrg	  __INT_N_201103 (__GLIBCXX_TYPE_INT_N_2),
1649*b1e83836Smrg	  __INT_N_U201103 (__GLIBCXX_TYPE_INT_N_2))
16504d5abbe8Smrg#endif
16514d5abbe8Smrg#ifdef __GLIBCXX_TYPE_INT_N_3
16524d5abbe8Smrg  __INT_N (__GLIBCXX_TYPE_INT_N_3, __GLIBCXX_BITSIZE_INT_N_3,
1653*b1e83836Smrg	  __INT_N_201103 (__GLIBCXX_TYPE_INT_N_3),
1654*b1e83836Smrg	  __INT_N_U201103 (__GLIBCXX_TYPE_INT_N_3))
16554d5abbe8Smrg#endif
165648fb7bfaSmrg
1657fb8a8121Smrg#elif defined __STRICT_ANSI__ && defined __SIZEOF_INT128__
1658fb8a8121Smrg  __INT_N(__int128, 128,
1659fb8a8121Smrg	  __INT_N_201103 (__int128),
1660fb8a8121Smrg	  __INT_N_U201103 (__int128))
1661fb8a8121Smrg#endif
1662fb8a8121Smrg
16634d5abbe8Smrg#undef __INT_N
16644d5abbe8Smrg#undef __INT_N_201103
16654d5abbe8Smrg#undef __INT_N_U201103
166648fb7bfaSmrg
166748fb7bfaSmrg
16684fee23f9Smrg  /// numeric_limits<float> specialization.
16694fee23f9Smrg  template<>
16704fee23f9Smrg    struct numeric_limits<float>
16714fee23f9Smrg    {
167248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
16734fee23f9Smrg
167448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR float
167548fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return __FLT_MIN__; }
167648fb7bfaSmrg
167748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR float
167848fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __FLT_MAX__; }
167948fb7bfaSmrg
168048fb7bfaSmrg#if __cplusplus >= 201103L
168148fb7bfaSmrg      static constexpr float
168248fb7bfaSmrg      lowest() noexcept { return -__FLT_MAX__; }
16834fee23f9Smrg#endif
16844fee23f9Smrg
168548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits = __FLT_MANT_DIG__;
168648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10 = __FLT_DIG__;
168748fb7bfaSmrg#if __cplusplus >= 201103L
168848fb7bfaSmrg      static constexpr int max_digits10
16894fee23f9Smrg	 = __glibcxx_max_digits10 (__FLT_MANT_DIG__);
16904fee23f9Smrg#endif
169148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
169248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = false;
169348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = false;
169448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = __FLT_RADIX__;
16954fee23f9Smrg
169648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR float
169748fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return __FLT_EPSILON__; }
16984fee23f9Smrg
169948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR float
170048fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0.5F; }
170148fb7bfaSmrg
170248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = __FLT_MIN_EXP__;
170348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = __FLT_MIN_10_EXP__;
170448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = __FLT_MAX_EXP__;
170548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = __FLT_MAX_10_EXP__;
170648fb7bfaSmrg
170748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = __FLT_HAS_INFINITY__;
170848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = __FLT_HAS_QUIET_NAN__;
170948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = has_quiet_NaN;
171048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
17114fee23f9Smrg	= bool(__FLT_HAS_DENORM__) ? denorm_present : denorm_absent;
171248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss
171348fb7bfaSmrg       = __glibcxx_float_has_denorm_loss;
17144fee23f9Smrg
171548fb7bfaSmrg      static _GLIBCXX_CONSTEXPR float
171648fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT { return __builtin_huge_valf(); }
17174fee23f9Smrg
171848fb7bfaSmrg      static _GLIBCXX_CONSTEXPR float
171948fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return __builtin_nanf(""); }
172048fb7bfaSmrg
172148fb7bfaSmrg      static _GLIBCXX_CONSTEXPR float
172248fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return __builtin_nansf(""); }
172348fb7bfaSmrg
172448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR float
172548fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT { return __FLT_DENORM_MIN__; }
172648fb7bfaSmrg
172748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559
17284fee23f9Smrg	= has_infinity && has_quiet_NaN && has_denorm == denorm_present;
172948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
173048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
17314fee23f9Smrg
173248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_float_traps;
173348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before
173448fb7bfaSmrg       = __glibcxx_float_tinyness_before;
173548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
173648fb7bfaSmrg       = round_to_nearest;
17374fee23f9Smrg    };
17384fee23f9Smrg
17394fee23f9Smrg#undef __glibcxx_float_has_denorm_loss
17404fee23f9Smrg#undef __glibcxx_float_traps
17414fee23f9Smrg#undef __glibcxx_float_tinyness_before
17424fee23f9Smrg
17434fee23f9Smrg  /// numeric_limits<double> specialization.
17444fee23f9Smrg  template<>
17454fee23f9Smrg    struct numeric_limits<double>
17464fee23f9Smrg    {
174748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
17484fee23f9Smrg
174948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR double
175048fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return __DBL_MIN__; }
175148fb7bfaSmrg
175248fb7bfaSmrg      static _GLIBCXX_CONSTEXPR double
175348fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __DBL_MAX__; }
175448fb7bfaSmrg
175548fb7bfaSmrg#if __cplusplus >= 201103L
175648fb7bfaSmrg      static constexpr double
175748fb7bfaSmrg      lowest() noexcept { return -__DBL_MAX__; }
17584fee23f9Smrg#endif
17594fee23f9Smrg
176048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits = __DBL_MANT_DIG__;
176148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10 = __DBL_DIG__;
176248fb7bfaSmrg#if __cplusplus >= 201103L
176348fb7bfaSmrg      static constexpr int max_digits10
17644fee23f9Smrg	 = __glibcxx_max_digits10 (__DBL_MANT_DIG__);
17654fee23f9Smrg#endif
176648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
176748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = false;
176848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = false;
176948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = __FLT_RADIX__;
17704fee23f9Smrg
177148fb7bfaSmrg      static _GLIBCXX_CONSTEXPR double
177248fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return __DBL_EPSILON__; }
17734fee23f9Smrg
177448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR double
177548fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0.5; }
177648fb7bfaSmrg
177748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = __DBL_MIN_EXP__;
177848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = __DBL_MIN_10_EXP__;
177948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = __DBL_MAX_EXP__;
178048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = __DBL_MAX_10_EXP__;
178148fb7bfaSmrg
178248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = __DBL_HAS_INFINITY__;
178348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = __DBL_HAS_QUIET_NAN__;
178448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = has_quiet_NaN;
178548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
17864fee23f9Smrg	= bool(__DBL_HAS_DENORM__) ? denorm_present : denorm_absent;
178748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss
178848fb7bfaSmrg        = __glibcxx_double_has_denorm_loss;
17894fee23f9Smrg
179048fb7bfaSmrg      static _GLIBCXX_CONSTEXPR double
179148fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT { return __builtin_huge_val(); }
17924fee23f9Smrg
179348fb7bfaSmrg      static _GLIBCXX_CONSTEXPR double
179448fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return __builtin_nan(""); }
179548fb7bfaSmrg
179648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR double
179748fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return __builtin_nans(""); }
179848fb7bfaSmrg
179948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR double
180048fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT { return __DBL_DENORM_MIN__; }
180148fb7bfaSmrg
180248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559
18034fee23f9Smrg	= has_infinity && has_quiet_NaN && has_denorm == denorm_present;
180448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
180548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
18064fee23f9Smrg
180748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_double_traps;
180848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before
180948fb7bfaSmrg       = __glibcxx_double_tinyness_before;
181048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
181148fb7bfaSmrg       = round_to_nearest;
18124fee23f9Smrg    };
18134fee23f9Smrg
18144fee23f9Smrg#undef __glibcxx_double_has_denorm_loss
18154fee23f9Smrg#undef __glibcxx_double_traps
18164fee23f9Smrg#undef __glibcxx_double_tinyness_before
18174fee23f9Smrg
18184fee23f9Smrg  /// numeric_limits<long double> specialization.
18194fee23f9Smrg  template<>
18204fee23f9Smrg    struct numeric_limits<long double>
18214fee23f9Smrg    {
182248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
18234fee23f9Smrg
182448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long double
182548fb7bfaSmrg      min() _GLIBCXX_USE_NOEXCEPT { return __LDBL_MIN__; }
182648fb7bfaSmrg
182748fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long double
182848fb7bfaSmrg      max() _GLIBCXX_USE_NOEXCEPT { return __LDBL_MAX__; }
182948fb7bfaSmrg
183048fb7bfaSmrg#if __cplusplus >= 201103L
183148fb7bfaSmrg      static constexpr long double
183248fb7bfaSmrg      lowest() noexcept { return -__LDBL_MAX__; }
18334fee23f9Smrg#endif
18344fee23f9Smrg
183548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits = __LDBL_MANT_DIG__;
183648fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int digits10 = __LDBL_DIG__;
183748fb7bfaSmrg#if __cplusplus >= 201103L
183848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_digits10
18394fee23f9Smrg	 = __glibcxx_max_digits10 (__LDBL_MANT_DIG__);
18404fee23f9Smrg#endif
184148fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
184248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_integer = false;
184348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_exact = false;
184448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int radix = __FLT_RADIX__;
18454fee23f9Smrg
184648fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long double
184748fb7bfaSmrg      epsilon() _GLIBCXX_USE_NOEXCEPT { return __LDBL_EPSILON__; }
18484fee23f9Smrg
184948fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long double
185048fb7bfaSmrg      round_error() _GLIBCXX_USE_NOEXCEPT { return 0.5L; }
185148fb7bfaSmrg
185248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent = __LDBL_MIN_EXP__;
185348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = __LDBL_MIN_10_EXP__;
185448fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent = __LDBL_MAX_EXP__;
185548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = __LDBL_MAX_10_EXP__;
185648fb7bfaSmrg
185748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = __LDBL_HAS_INFINITY__;
185848fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = __LDBL_HAS_QUIET_NAN__;
185948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = has_quiet_NaN;
186048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
18614fee23f9Smrg	= bool(__LDBL_HAS_DENORM__) ? denorm_present : denorm_absent;
186248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss
18634fee23f9Smrg	= __glibcxx_long_double_has_denorm_loss;
18644fee23f9Smrg
186548fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long double
186648fb7bfaSmrg      infinity() _GLIBCXX_USE_NOEXCEPT { return __builtin_huge_vall(); }
18674fee23f9Smrg
186848fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long double
186948fb7bfaSmrg      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return __builtin_nanl(""); }
187048fb7bfaSmrg
187148fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long double
187248fb7bfaSmrg      signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return __builtin_nansl(""); }
187348fb7bfaSmrg
187448fb7bfaSmrg      static _GLIBCXX_CONSTEXPR long double
187548fb7bfaSmrg      denorm_min() _GLIBCXX_USE_NOEXCEPT { return __LDBL_DENORM_MIN__; }
187648fb7bfaSmrg
187748fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_iec559
18784fee23f9Smrg	= has_infinity && has_quiet_NaN && has_denorm == denorm_present;
187948fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
188048fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
18814fee23f9Smrg
188248fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_long_double_traps;
188348fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before =
188448fb7bfaSmrg					 __glibcxx_long_double_tinyness_before;
188548fb7bfaSmrg      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style =
188648fb7bfaSmrg						      round_to_nearest;
18874fee23f9Smrg    };
18884fee23f9Smrg
18894fee23f9Smrg#undef __glibcxx_long_double_has_denorm_loss
18904fee23f9Smrg#undef __glibcxx_long_double_traps
18914fee23f9Smrg#undef __glibcxx_long_double_tinyness_before
18924fee23f9Smrg
189348fb7bfaSmrg_GLIBCXX_END_NAMESPACE_VERSION
189448fb7bfaSmrg} // namespace
18954fee23f9Smrg
18964fee23f9Smrg#undef __glibcxx_signed
18974fee23f9Smrg#undef __glibcxx_min
18984fee23f9Smrg#undef __glibcxx_max
18994fee23f9Smrg#undef __glibcxx_digits
19004fee23f9Smrg#undef __glibcxx_digits10
19014fee23f9Smrg#undef __glibcxx_max_digits10
19024fee23f9Smrg
19034fee23f9Smrg#endif // _GLIBCXX_NUMERIC_LIMITS
1904