1f8a1b7d9SAlexander Kabaev // The template and inlines for the numeric_limits classes. -*- C++ -*-
200db7afdSDavid E. O'Brien 
3f8a1b7d9SAlexander Kabaev // Copyright (C) 1999, 2000, 2001, 2002, 2003, 2005
4f8a1b7d9SAlexander Kabaev // Free Software Foundation, Inc.
500db7afdSDavid E. O'Brien //
600db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library.  This library is free
700db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
800db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
900db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
1000db7afdSDavid E. O'Brien // any later version.
1100db7afdSDavid E. O'Brien 
1200db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1300db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1400db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1500db7afdSDavid E. O'Brien // GNU General Public License for more details.
1600db7afdSDavid E. O'Brien 
1700db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1800db7afdSDavid E. O'Brien // with this library; see the file COPYING.  If not, write to the Free
19f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
2000db7afdSDavid E. O'Brien // USA.
2100db7afdSDavid E. O'Brien 
2200db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2300db7afdSDavid E. O'Brien // library without restriction.  Specifically, if other files instantiate
2400db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2500db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2600db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2700db7afdSDavid E. O'Brien // the GNU General Public License.  This exception does not however
2800db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
2900db7afdSDavid E. O'Brien // the GNU General Public License.
3000db7afdSDavid E. O'Brien 
31f8a1b7d9SAlexander Kabaev /** @file limits
32f8a1b7d9SAlexander Kabaev  *  This is a Standard C++ Library header.
33f8a1b7d9SAlexander Kabaev  */
34f8a1b7d9SAlexander Kabaev 
3500db7afdSDavid E. O'Brien // Note: this is not a conforming implementation.
3600db7afdSDavid E. O'Brien // Written by Gabriel Dos Reis <[email protected]>
3700db7afdSDavid E. O'Brien 
3800db7afdSDavid E. O'Brien //
3900db7afdSDavid E. O'Brien // ISO 14882:1998
4000db7afdSDavid E. O'Brien // 18.2.1
4100db7afdSDavid E. O'Brien //
4200db7afdSDavid E. O'Brien 
43ffeaf689SAlexander Kabaev #ifndef _GLIBCXX_NUMERIC_LIMITS
44ffeaf689SAlexander Kabaev #define _GLIBCXX_NUMERIC_LIMITS 1
4500db7afdSDavid E. O'Brien 
4600db7afdSDavid E. O'Brien #pragma GCC system_header
4700db7afdSDavid E. O'Brien 
4800db7afdSDavid E. O'Brien #include <bits/c++config.h>
4900db7afdSDavid E. O'Brien 
5000db7afdSDavid E. O'Brien //
5100db7afdSDavid E. O'Brien // The numeric_limits<> traits document implementation-defined aspects
5200db7afdSDavid E. O'Brien // of fundamental arithmetic data types (integers and floating points).
5300db7afdSDavid E. O'Brien // From Standard C++ point of view, there are 13 such types:
5400db7afdSDavid E. O'Brien //   * integers
5500db7afdSDavid E. O'Brien //         bool						        (1)
5600db7afdSDavid E. O'Brien //         char, signed char, unsigned char			(3)
5700db7afdSDavid E. O'Brien //         short, unsigned short				(2)
5800db7afdSDavid E. O'Brien //         int, unsigned					(2)
5900db7afdSDavid E. O'Brien //         long, unsigned long					(2)
6000db7afdSDavid E. O'Brien //
6100db7afdSDavid E. O'Brien //   * floating points
6200db7afdSDavid E. O'Brien //         float						(1)
6300db7afdSDavid E. O'Brien //         double						(1)
6400db7afdSDavid E. O'Brien //         long double						(1)
6500db7afdSDavid E. O'Brien //
6600db7afdSDavid E. O'Brien // GNU C++ undertstands (where supported by the host C-library)
6700db7afdSDavid E. O'Brien //   * integer
6800db7afdSDavid E. O'Brien //         long long, unsigned long long			(2)
6900db7afdSDavid E. O'Brien //
7000db7afdSDavid E. O'Brien // which brings us to 15 fundamental arithmetic data types in GNU C++.
7100db7afdSDavid E. O'Brien //
7200db7afdSDavid E. O'Brien //
7300db7afdSDavid E. O'Brien // Since a numeric_limits<> is a bit tricky to get right, we rely on
7400db7afdSDavid E. O'Brien // an interface composed of macros which should be defined in config/os
7500db7afdSDavid E. O'Brien // or config/cpu when they differ from the generic (read arbitrary)
7600db7afdSDavid E. O'Brien // definitions given here.
7700db7afdSDavid E. O'Brien //
7800db7afdSDavid E. O'Brien 
7900db7afdSDavid E. O'Brien // These values can be overridden in the target configuration file.
8000db7afdSDavid E. O'Brien // The default values are appropriate for many 32-bit targets.
8100db7afdSDavid E. O'Brien 
821b86b14eSAlexander Kabaev // GCC only intrinsicly supports modulo integral types.  The only remaining
831b86b14eSAlexander Kabaev // integral exceptional values is division by zero.  Only targets that do not
841b86b14eSAlexander Kabaev // signal division by zero in some "hard to ignore" way should use false.
85ffeaf689SAlexander Kabaev #ifndef __glibcxx_integral_traps
86ffeaf689SAlexander Kabaev # define __glibcxx_integral_traps true
8700db7afdSDavid E. O'Brien #endif
8800db7afdSDavid E. O'Brien 
8900db7afdSDavid E. O'Brien // float
9000db7afdSDavid E. O'Brien //
9100db7afdSDavid E. O'Brien 
921b86b14eSAlexander Kabaev // Default values.  Should be overriden in configuration files if necessary.
9300db7afdSDavid E. O'Brien 
94ffeaf689SAlexander Kabaev #ifndef __glibcxx_float_has_denorm_loss
95ffeaf689SAlexander Kabaev #  define __glibcxx_float_has_denorm_loss false
9600db7afdSDavid E. O'Brien #endif
97ffeaf689SAlexander Kabaev #ifndef __glibcxx_float_traps
98ffeaf689SAlexander Kabaev #  define __glibcxx_float_traps false
9900db7afdSDavid E. O'Brien #endif
100ffeaf689SAlexander Kabaev #ifndef __glibcxx_float_tinyness_before
101ffeaf689SAlexander Kabaev #  define __glibcxx_float_tinyness_before false
10200db7afdSDavid E. O'Brien #endif
10300db7afdSDavid E. O'Brien 
10400db7afdSDavid E. O'Brien // double
10500db7afdSDavid E. O'Brien 
1061b86b14eSAlexander Kabaev // Default values.  Should be overriden in configuration files if necessary.
10700db7afdSDavid E. O'Brien 
108ffeaf689SAlexander Kabaev #ifndef __glibcxx_double_has_denorm_loss
109ffeaf689SAlexander Kabaev #  define __glibcxx_double_has_denorm_loss false
11000db7afdSDavid E. O'Brien #endif
111ffeaf689SAlexander Kabaev #ifndef __glibcxx_double_traps
112ffeaf689SAlexander Kabaev #  define __glibcxx_double_traps false
11300db7afdSDavid E. O'Brien #endif
114ffeaf689SAlexander Kabaev #ifndef __glibcxx_double_tinyness_before
115ffeaf689SAlexander Kabaev #  define __glibcxx_double_tinyness_before false
11600db7afdSDavid E. O'Brien #endif
11700db7afdSDavid E. O'Brien 
11800db7afdSDavid E. O'Brien // long double
11900db7afdSDavid E. O'Brien 
1201b86b14eSAlexander Kabaev // Default values.  Should be overriden in configuration files if necessary.
12100db7afdSDavid E. O'Brien 
122ffeaf689SAlexander Kabaev #ifndef __glibcxx_long_double_has_denorm_loss
123ffeaf689SAlexander Kabaev #  define __glibcxx_long_double_has_denorm_loss false
12400db7afdSDavid E. O'Brien #endif
125ffeaf689SAlexander Kabaev #ifndef __glibcxx_long_double_traps
126ffeaf689SAlexander Kabaev #  define __glibcxx_long_double_traps false
12700db7afdSDavid E. O'Brien #endif
128ffeaf689SAlexander Kabaev #ifndef __glibcxx_long_double_tinyness_before
129ffeaf689SAlexander Kabaev #  define __glibcxx_long_double_tinyness_before false
13000db7afdSDavid E. O'Brien #endif
13100db7afdSDavid E. O'Brien 
1321b86b14eSAlexander Kabaev // You should not need to define any macros below this point.
1331b86b14eSAlexander Kabaev 
134ffeaf689SAlexander Kabaev #define __glibcxx_signed(T)	((T)(-1) < 0)
1351b86b14eSAlexander Kabaev 
136ffeaf689SAlexander Kabaev #define __glibcxx_min(T) \
137*b8d52352SAndrew Turner   (__glibcxx_signed (T) ? (((T)1 << (__glibcxx_digits (T) - 1)) << 1) : (T)0)
1381b86b14eSAlexander Kabaev 
139ffeaf689SAlexander Kabaev #define __glibcxx_max(T) \
140*b8d52352SAndrew Turner   (__glibcxx_signed (T) ? \
141*b8d52352SAndrew Turner    (((((T)1 << (__glibcxx_digits (T) - 1)) - 1) << 1) + 1) : ~(T)0)
1421b86b14eSAlexander Kabaev 
143ffeaf689SAlexander Kabaev #define __glibcxx_digits(T) \
144ffeaf689SAlexander Kabaev   (sizeof(T) * __CHAR_BIT__ - __glibcxx_signed (T))
1451b86b14eSAlexander Kabaev 
1461b86b14eSAlexander Kabaev // The fraction 643/2136 approximates log10(2) to 7 significant digits.
147ffeaf689SAlexander Kabaev #define __glibcxx_digits10(T) \
148ffeaf689SAlexander Kabaev   (__glibcxx_digits (T) * 643 / 2136)
14900db7afdSDavid E. O'Brien 
15000db7afdSDavid E. O'Brien 
151f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
152f8a1b7d9SAlexander Kabaev 
153ffeaf689SAlexander Kabaev   /**
154ffeaf689SAlexander Kabaev    *  @brief Describes the rounding style for floating-point types.
155ffeaf689SAlexander Kabaev    *
156ffeaf689SAlexander Kabaev    *  This is used in the std::numeric_limits class.
157ffeaf689SAlexander Kabaev   */
15800db7afdSDavid E. O'Brien   enum float_round_style
15900db7afdSDavid E. O'Brien   {
160ffeaf689SAlexander Kabaev     round_indeterminate       = -1,    ///< Self-explanatory.
161ffeaf689SAlexander Kabaev     round_toward_zero         = 0,     ///< Self-explanatory.
162ffeaf689SAlexander Kabaev     round_to_nearest          = 1,     ///< To the nearest representable value.
163ffeaf689SAlexander Kabaev     round_toward_infinity     = 2,     ///< Self-explanatory.
164ffeaf689SAlexander Kabaev     round_toward_neg_infinity = 3      ///< Self-explanatory.
16500db7afdSDavid E. O'Brien   };
16600db7afdSDavid E. O'Brien 
167ffeaf689SAlexander Kabaev   /**
168ffeaf689SAlexander Kabaev    *  @brief Describes the denormalization for floating-point types.
169ffeaf689SAlexander Kabaev    *
170ffeaf689SAlexander Kabaev    *  These values represent the presence or absence of a variable number
171ffeaf689SAlexander Kabaev    *  of exponent bits.  This type is used in the std::numeric_limits class.
172ffeaf689SAlexander Kabaev   */
17300db7afdSDavid E. O'Brien   enum float_denorm_style
17400db7afdSDavid E. O'Brien   {
175ffeaf689SAlexander Kabaev     /// Indeterminate at compile time whether denormalized values are allowed.
17600db7afdSDavid E. O'Brien     denorm_indeterminate = -1,
177ffeaf689SAlexander Kabaev     /// The type does not allow denormalized values.
17800db7afdSDavid E. O'Brien     denorm_absent        = 0,
179ffeaf689SAlexander Kabaev     /// The type allows denormalized values.
18000db7afdSDavid E. O'Brien     denorm_present       = 1
18100db7afdSDavid E. O'Brien   };
18200db7afdSDavid E. O'Brien 
183ffeaf689SAlexander Kabaev   /**
184ffeaf689SAlexander Kabaev    *  @brief Part of std::numeric_limits.
185ffeaf689SAlexander Kabaev    *
186ffeaf689SAlexander Kabaev    *  The @c static @c const members are usable as integral constant
187ffeaf689SAlexander Kabaev    *  expressions.
188ffeaf689SAlexander Kabaev    *
189ffeaf689SAlexander Kabaev    *  @note This is a seperate class for purposes of efficiency; you
190ffeaf689SAlexander Kabaev    *        should only access these members as part of an instantiation
191ffeaf689SAlexander Kabaev    *        of the std::numeric_limits class.
192ffeaf689SAlexander Kabaev   */
19300db7afdSDavid E. O'Brien   struct __numeric_limits_base
19400db7afdSDavid E. O'Brien   {
195ffeaf689SAlexander Kabaev     /** This will be true for all fundamental types (which have
196ffeaf689SAlexander Kabaev         specializations), and false for everything else.  */
19700db7afdSDavid E. O'Brien     static const bool is_specialized = false;
19800db7afdSDavid E. O'Brien 
199ffeaf689SAlexander Kabaev     /** The number of @c radix digits that be represented without change:  for
200ffeaf689SAlexander Kabaev         integer types, the number of non-sign bits in the mantissa; for
201ffeaf689SAlexander Kabaev         floating types, the number of @c radix digits in the mantissa.  */
20200db7afdSDavid E. O'Brien     static const int digits = 0;
203ffeaf689SAlexander Kabaev     /** The number of base 10 digits that can be represented without change. */
20400db7afdSDavid E. O'Brien     static const int digits10 = 0;
205ffeaf689SAlexander Kabaev     /** True if the type is signed.  */
20600db7afdSDavid E. O'Brien     static const bool is_signed = false;
207ffeaf689SAlexander Kabaev     /** True if the type is integer.
208ffeaf689SAlexander Kabaev      *  @if maint
209ffeaf689SAlexander Kabaev      *  Is this supposed to be "if the type is integral"?
210ffeaf689SAlexander Kabaev      *  @endif
211ffeaf689SAlexander Kabaev     */
21200db7afdSDavid E. O'Brien     static const bool is_integer = false;
213ffeaf689SAlexander Kabaev     /** True if the type uses an exact representation.  "All integer types are
214ffeaf689SAlexander Kabaev         exact, but not all exact types are integer.  For example, rational and
215ffeaf689SAlexander Kabaev         fixed-exponent representations are exact but not integer."
216ffeaf689SAlexander Kabaev         [18.2.1.2]/15  */
21700db7afdSDavid E. O'Brien     static const bool is_exact = false;
218ffeaf689SAlexander Kabaev     /** For integer types, specifies the base of the representation.  For
219ffeaf689SAlexander Kabaev         floating types, specifies the base of the exponent representation.  */
22000db7afdSDavid E. O'Brien     static const int radix = 0;
22100db7afdSDavid E. O'Brien 
222ffeaf689SAlexander Kabaev     /** The minimum negative integer such that @c radix raised to the power of
223ffeaf689SAlexander Kabaev         (one less than that integer) is a normalized floating point number.  */
22400db7afdSDavid E. O'Brien     static const int min_exponent = 0;
225ffeaf689SAlexander Kabaev     /** The minimum negative integer such that 10 raised to that power is in
226ffeaf689SAlexander Kabaev         the range of normalized floating point numbers.  */
22700db7afdSDavid E. O'Brien     static const int min_exponent10 = 0;
228ffeaf689SAlexander Kabaev     /** The maximum positive integer such that @c radix raised to the power of
229ffeaf689SAlexander Kabaev         (one less than that integer) is a representable finite floating point
230ffeaf689SAlexander Kabaev 	number.  */
23100db7afdSDavid E. O'Brien     static const int max_exponent = 0;
232ffeaf689SAlexander Kabaev     /** The maximum positive integer such that 10 raised to that power is in
233ffeaf689SAlexander Kabaev         the range of representable finite floating point numbers.  */
23400db7afdSDavid E. O'Brien     static const int max_exponent10 = 0;
23500db7afdSDavid E. O'Brien 
236ffeaf689SAlexander Kabaev     /** True if the type has a representation for positive infinity.  */
23700db7afdSDavid E. O'Brien     static const bool has_infinity = false;
238ffeaf689SAlexander Kabaev     /** True if the type has a representation for a quiet (non-signaling)
239ffeaf689SAlexander Kabaev         "Not a Number."  */
24000db7afdSDavid E. O'Brien     static const bool has_quiet_NaN = false;
241ffeaf689SAlexander Kabaev     /** True if the type has a representation for a signaling
242ffeaf689SAlexander Kabaev         "Not a Number."  */
24300db7afdSDavid E. O'Brien     static const bool has_signaling_NaN = false;
244ffeaf689SAlexander Kabaev     /** See std::float_denorm_style for more information.  */
24500db7afdSDavid E. O'Brien     static const float_denorm_style has_denorm = denorm_absent;
246ffeaf689SAlexander Kabaev     /** "True if loss of accuracy is detected as a denormalization loss,
247ffeaf689SAlexander Kabaev         rather than as an inexact result." [18.2.1.2]/42  */
24800db7afdSDavid E. O'Brien     static const bool has_denorm_loss = false;
24900db7afdSDavid E. O'Brien 
250ffeaf689SAlexander Kabaev     /** True if-and-only-if the type adheres to the IEC 559 standard, also
251ffeaf689SAlexander Kabaev         known as IEEE 754.  (Only makes sense for floating point types.)  */
25200db7afdSDavid E. O'Brien     static const bool is_iec559 = false;
253ffeaf689SAlexander Kabaev     /** "True if the set of values representable by the type is finite.   All
254ffeaf689SAlexander Kabaev         built-in types are bounded, this member would be false for arbitrary
255ffeaf689SAlexander Kabaev 	precision types." [18.2.1.2]/54  */
25600db7afdSDavid E. O'Brien     static const bool is_bounded = false;
257ffeaf689SAlexander Kabaev     /** True if the type is @e modulo, that is, if it is possible to add two
258ffeaf689SAlexander Kabaev         positive numbers and have a result that wraps around to a third number
259ffeaf689SAlexander Kabaev         that is less.  Typically false for floating types, true for unsigned
260ffeaf689SAlexander Kabaev         integers, and true for signed integers.  */
26100db7afdSDavid E. O'Brien     static const bool is_modulo = false;
26200db7afdSDavid E. O'Brien 
263ffeaf689SAlexander Kabaev     /** True if trapping is implemented for this type.  */
26400db7afdSDavid E. O'Brien     static const bool traps = false;
265ffeaf689SAlexander Kabaev     /** True if tinyness is detected before rounding.  (see IEC 559)  */
26600db7afdSDavid E. O'Brien     static const bool tinyness_before = false;
267ffeaf689SAlexander Kabaev     /** See std::float_round_style for more information.  This is only
268ffeaf689SAlexander Kabaev         meaningful for floating types; integer types will all be
269ffeaf689SAlexander Kabaev 	round_toward_zero.  */
27000db7afdSDavid E. O'Brien     static const float_round_style round_style = round_toward_zero;
27100db7afdSDavid E. O'Brien   };
27200db7afdSDavid E. O'Brien 
273ffeaf689SAlexander Kabaev   /**
274ffeaf689SAlexander Kabaev    *  @brief Properties of fundamental types.
275ffeaf689SAlexander Kabaev    *
276ffeaf689SAlexander Kabaev    *  This class allows a program to obtain information about the
277ffeaf689SAlexander Kabaev    *  representation of a fundamental type on a given platform.  For
278ffeaf689SAlexander Kabaev    *  non-fundamental types, the functions will return 0 and the data
279ffeaf689SAlexander Kabaev    *  members will all be @c false.
280ffeaf689SAlexander Kabaev    *
281ffeaf689SAlexander Kabaev    *  @if maint
282ffeaf689SAlexander Kabaev    *  _GLIBCXX_RESOLVE_LIB_DEFECTS:  DRs 201 and 184 (hi Gaby!) are
283ffeaf689SAlexander Kabaev    *  noted, but not incorporated in this documented (yet).
284ffeaf689SAlexander Kabaev    *  @endif
285ffeaf689SAlexander Kabaev   */
28600db7afdSDavid E. O'Brien   template<typename _Tp>
28700db7afdSDavid E. O'Brien     struct numeric_limits : public __numeric_limits_base
28800db7afdSDavid E. O'Brien     {
289ffeaf689SAlexander Kabaev       /** The minimum finite value, or for floating types with
290ffeaf689SAlexander Kabaev           denormalization, the minimum positive normalized value.  */
minnumeric_limits29100db7afdSDavid E. O'Brien       static _Tp min() throw() { return static_cast<_Tp>(0); }
292ffeaf689SAlexander Kabaev       /** The maximum finite value.  */
maxnumeric_limits29300db7afdSDavid E. O'Brien       static _Tp max() throw() { return static_cast<_Tp>(0); }
294ffeaf689SAlexander Kabaev       /** The @e machine @e epsilon:  the difference between 1 and the least
295ffeaf689SAlexander Kabaev           value greater than 1 that is representable.  */
epsilonnumeric_limits29600db7afdSDavid E. O'Brien       static _Tp epsilon() throw() { return static_cast<_Tp>(0); }
297ffeaf689SAlexander Kabaev       /** The maximum rounding error measurement (see LIA-1).  */
round_errornumeric_limits29800db7afdSDavid E. O'Brien       static _Tp round_error() throw() { return static_cast<_Tp>(0); }
299ffeaf689SAlexander Kabaev       /** The representation of positive infinity, if @c has_infinity.  */
infinitynumeric_limits30000db7afdSDavid E. O'Brien       static _Tp infinity() throw()  { return static_cast<_Tp>(0); }
301ffeaf689SAlexander Kabaev       /** The representation of a quiet "Not a Number," if @c has_quiet_NaN. */
quiet_NaNnumeric_limits30200db7afdSDavid E. O'Brien       static _Tp quiet_NaN() throw() { return static_cast<_Tp>(0); }
303ffeaf689SAlexander Kabaev       /** The representation of a signaling "Not a Number," if
304ffeaf689SAlexander Kabaev           @c has_signaling_NaN. */
signaling_NaNnumeric_limits30500db7afdSDavid E. O'Brien       static _Tp signaling_NaN() throw() { return static_cast<_Tp>(0); }
306ffeaf689SAlexander Kabaev       /** The minimum positive denormalized value.  For types where
307ffeaf689SAlexander Kabaev           @c has_denorm is false, this is the minimum positive normalized
308ffeaf689SAlexander Kabaev 	  value.  */
denorm_minnumeric_limits30900db7afdSDavid E. O'Brien       static _Tp denorm_min() throw() { return static_cast<_Tp>(0); }
31000db7afdSDavid E. O'Brien     };
31100db7afdSDavid E. O'Brien 
31200db7afdSDavid E. O'Brien   // Now there follow 15 explicit specializations.  Yes, 15.  Make sure
31300db7afdSDavid E. O'Brien   // you get the count right.
314f8a1b7d9SAlexander Kabaev 
315f8a1b7d9SAlexander Kabaev   /// numeric_limits<bool> specialization.
31600db7afdSDavid E. O'Brien   template<>
31700db7afdSDavid E. O'Brien     struct numeric_limits<bool>
31800db7afdSDavid E. O'Brien     {
31900db7afdSDavid E. O'Brien       static const bool is_specialized = true;
32000db7afdSDavid E. O'Brien 
32100db7afdSDavid E. O'Brien       static bool min() throw()
32200db7afdSDavid E. O'Brien       { return false; }
32300db7afdSDavid E. O'Brien       static bool max() throw()
32400db7afdSDavid E. O'Brien       { return true; }
32500db7afdSDavid E. O'Brien 
3261b86b14eSAlexander Kabaev       static const int digits = 1;
32700db7afdSDavid E. O'Brien       static const int digits10 = 0;
32800db7afdSDavid E. O'Brien       static const bool is_signed = false;
32900db7afdSDavid E. O'Brien       static const bool is_integer = true;
33000db7afdSDavid E. O'Brien       static const bool is_exact = true;
33100db7afdSDavid E. O'Brien       static const int radix = 2;
33200db7afdSDavid E. O'Brien       static bool epsilon() throw()
33300db7afdSDavid E. O'Brien       { return false; }
33400db7afdSDavid E. O'Brien       static bool round_error() throw()
33500db7afdSDavid E. O'Brien       { return false; }
33600db7afdSDavid E. O'Brien 
33700db7afdSDavid E. O'Brien       static const int min_exponent = 0;
33800db7afdSDavid E. O'Brien       static const int min_exponent10 = 0;
33900db7afdSDavid E. O'Brien       static const int max_exponent = 0;
34000db7afdSDavid E. O'Brien       static const int max_exponent10 = 0;
34100db7afdSDavid E. O'Brien 
34200db7afdSDavid E. O'Brien       static const bool has_infinity = false;
34300db7afdSDavid E. O'Brien       static const bool has_quiet_NaN = false;
34400db7afdSDavid E. O'Brien       static const bool has_signaling_NaN = false;
34500db7afdSDavid E. O'Brien       static const float_denorm_style has_denorm = denorm_absent;
34600db7afdSDavid E. O'Brien       static const bool has_denorm_loss = false;
34700db7afdSDavid E. O'Brien 
34800db7afdSDavid E. O'Brien       static bool infinity() throw()
34900db7afdSDavid E. O'Brien       { return false; }
35000db7afdSDavid E. O'Brien       static bool quiet_NaN() throw()
35100db7afdSDavid E. O'Brien       { return false; }
35200db7afdSDavid E. O'Brien       static bool signaling_NaN() throw()
35300db7afdSDavid E. O'Brien       { return false; }
35400db7afdSDavid E. O'Brien       static bool denorm_min() throw()
35500db7afdSDavid E. O'Brien       { return false; }
35600db7afdSDavid E. O'Brien 
35700db7afdSDavid E. O'Brien       static const bool is_iec559 = false;
35800db7afdSDavid E. O'Brien       static const bool is_bounded = true;
35900db7afdSDavid E. O'Brien       static const bool is_modulo = false;
36000db7afdSDavid E. O'Brien 
36100db7afdSDavid E. O'Brien       // It is not clear what it means for a boolean type to trap.
36200db7afdSDavid E. O'Brien       // This is a DR on the LWG issue list.  Here, I use integer
36300db7afdSDavid E. O'Brien       // promotion semantics.
364ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_integral_traps;
36500db7afdSDavid E. O'Brien       static const bool tinyness_before = false;
36600db7afdSDavid E. O'Brien       static const float_round_style round_style = round_toward_zero;
36700db7afdSDavid E. O'Brien     };
36800db7afdSDavid E. O'Brien 
369f8a1b7d9SAlexander Kabaev   /// numeric_limits<char> specialization.
37000db7afdSDavid E. O'Brien   template<>
37100db7afdSDavid E. O'Brien     struct numeric_limits<char>
37200db7afdSDavid E. O'Brien     {
37300db7afdSDavid E. O'Brien       static const bool is_specialized = true;
37400db7afdSDavid E. O'Brien 
37500db7afdSDavid E. O'Brien       static char min() throw()
376ffeaf689SAlexander Kabaev       { return __glibcxx_min(char); }
37700db7afdSDavid E. O'Brien       static char max() throw()
378ffeaf689SAlexander Kabaev       { return __glibcxx_max(char); }
37900db7afdSDavid E. O'Brien 
380ffeaf689SAlexander Kabaev       static const int digits = __glibcxx_digits (char);
381ffeaf689SAlexander Kabaev       static const int digits10 = __glibcxx_digits10 (char);
382ffeaf689SAlexander Kabaev       static const bool is_signed = __glibcxx_signed (char);
38300db7afdSDavid E. O'Brien       static const bool is_integer = true;
38400db7afdSDavid E. O'Brien       static const bool is_exact = true;
38500db7afdSDavid E. O'Brien       static const int radix = 2;
38600db7afdSDavid E. O'Brien       static char epsilon() throw()
3871b86b14eSAlexander Kabaev       { return 0; }
38800db7afdSDavid E. O'Brien       static char round_error() throw()
3891b86b14eSAlexander Kabaev       { return 0; }
39000db7afdSDavid E. O'Brien 
39100db7afdSDavid E. O'Brien       static const int min_exponent = 0;
39200db7afdSDavid E. O'Brien       static const int min_exponent10 = 0;
39300db7afdSDavid E. O'Brien       static const int max_exponent = 0;
39400db7afdSDavid E. O'Brien       static const int max_exponent10 = 0;
39500db7afdSDavid E. O'Brien 
39600db7afdSDavid E. O'Brien       static const bool has_infinity = false;
39700db7afdSDavid E. O'Brien       static const bool has_quiet_NaN = false;
39800db7afdSDavid E. O'Brien       static const bool has_signaling_NaN = false;
39900db7afdSDavid E. O'Brien       static const float_denorm_style has_denorm = denorm_absent;
40000db7afdSDavid E. O'Brien       static const bool has_denorm_loss = false;
40100db7afdSDavid E. O'Brien 
40200db7afdSDavid E. O'Brien       static char infinity() throw()
40300db7afdSDavid E. O'Brien       { return char(); }
40400db7afdSDavid E. O'Brien       static char quiet_NaN() throw()
40500db7afdSDavid E. O'Brien       { return char(); }
40600db7afdSDavid E. O'Brien       static char signaling_NaN() throw()
40700db7afdSDavid E. O'Brien       { return char(); }
40800db7afdSDavid E. O'Brien       static char denorm_min() throw()
40900db7afdSDavid E. O'Brien       { return static_cast<char>(0); }
41000db7afdSDavid E. O'Brien 
41100db7afdSDavid E. O'Brien       static const bool is_iec559 = false;
41200db7afdSDavid E. O'Brien       static const bool is_bounded = true;
4131b86b14eSAlexander Kabaev       static const bool is_modulo = true;
41400db7afdSDavid E. O'Brien 
415ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_integral_traps;
41600db7afdSDavid E. O'Brien       static const bool tinyness_before = false;
41700db7afdSDavid E. O'Brien       static const float_round_style round_style = round_toward_zero;
41800db7afdSDavid E. O'Brien     };
41900db7afdSDavid E. O'Brien 
420f8a1b7d9SAlexander Kabaev   /// numeric_limits<signed char> specialization.
42100db7afdSDavid E. O'Brien   template<>
42200db7afdSDavid E. O'Brien     struct numeric_limits<signed char>
42300db7afdSDavid E. O'Brien     {
42400db7afdSDavid E. O'Brien       static const bool is_specialized = true;
42500db7afdSDavid E. O'Brien 
42600db7afdSDavid E. O'Brien       static signed char min() throw()
4271b86b14eSAlexander Kabaev       { return -__SCHAR_MAX__ - 1; }
42800db7afdSDavid E. O'Brien       static signed char max() throw()
4291b86b14eSAlexander Kabaev       { return __SCHAR_MAX__; }
43000db7afdSDavid E. O'Brien 
431ffeaf689SAlexander Kabaev       static const int digits = __glibcxx_digits (signed char);
432ffeaf689SAlexander Kabaev       static const int digits10 = __glibcxx_digits10 (signed char);
43300db7afdSDavid E. O'Brien       static const bool is_signed = true;
43400db7afdSDavid E. O'Brien       static const bool is_integer = true;
43500db7afdSDavid E. O'Brien       static const bool is_exact = true;
43600db7afdSDavid E. O'Brien       static const int radix = 2;
43700db7afdSDavid E. O'Brien       static signed char epsilon() throw()
43800db7afdSDavid E. O'Brien       { return 0; }
43900db7afdSDavid E. O'Brien       static signed char round_error() throw()
44000db7afdSDavid E. O'Brien       { return 0; }
44100db7afdSDavid E. O'Brien 
44200db7afdSDavid E. O'Brien       static const int min_exponent = 0;
44300db7afdSDavid E. O'Brien       static const int min_exponent10 = 0;
44400db7afdSDavid E. O'Brien       static const int max_exponent = 0;
44500db7afdSDavid E. O'Brien       static const int max_exponent10 = 0;
44600db7afdSDavid E. O'Brien 
44700db7afdSDavid E. O'Brien       static const bool has_infinity = false;
44800db7afdSDavid E. O'Brien       static const bool has_quiet_NaN = false;
44900db7afdSDavid E. O'Brien       static const bool has_signaling_NaN = false;
45000db7afdSDavid E. O'Brien       static const float_denorm_style has_denorm = denorm_absent;
45100db7afdSDavid E. O'Brien       static const bool has_denorm_loss = false;
45200db7afdSDavid E. O'Brien 
45300db7afdSDavid E. O'Brien       static signed char infinity() throw()
45400db7afdSDavid E. O'Brien       { return static_cast<signed char>(0); }
45500db7afdSDavid E. O'Brien       static signed char quiet_NaN() throw()
45600db7afdSDavid E. O'Brien       { return static_cast<signed char>(0); }
45700db7afdSDavid E. O'Brien       static signed char signaling_NaN() throw()
45800db7afdSDavid E. O'Brien       { return static_cast<signed char>(0); }
45900db7afdSDavid E. O'Brien       static signed char denorm_min() throw()
46000db7afdSDavid E. O'Brien       { return static_cast<signed char>(0); }
46100db7afdSDavid E. O'Brien 
46200db7afdSDavid E. O'Brien       static const bool is_iec559 = false;
46300db7afdSDavid E. O'Brien       static const bool is_bounded = true;
4641b86b14eSAlexander Kabaev       static const bool is_modulo = true;
46500db7afdSDavid E. O'Brien 
466ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_integral_traps;
46700db7afdSDavid E. O'Brien       static const bool tinyness_before = false;
46800db7afdSDavid E. O'Brien       static const float_round_style round_style = round_toward_zero;
46900db7afdSDavid E. O'Brien     };
47000db7afdSDavid E. O'Brien 
471f8a1b7d9SAlexander Kabaev   /// numeric_limits<unsigned char> specialization.
47200db7afdSDavid E. O'Brien   template<>
47300db7afdSDavid E. O'Brien     struct numeric_limits<unsigned char>
47400db7afdSDavid E. O'Brien     {
47500db7afdSDavid E. O'Brien       static const bool is_specialized = true;
47600db7afdSDavid E. O'Brien 
47700db7afdSDavid E. O'Brien       static unsigned char min() throw()
47800db7afdSDavid E. O'Brien       { return 0; }
47900db7afdSDavid E. O'Brien       static unsigned char max() throw()
4801b86b14eSAlexander Kabaev       { return __SCHAR_MAX__ * 2U + 1; }
48100db7afdSDavid E. O'Brien 
482ffeaf689SAlexander Kabaev       static const int digits = __glibcxx_digits (unsigned char);
483ffeaf689SAlexander Kabaev       static const int digits10 = __glibcxx_digits10 (unsigned char);
48400db7afdSDavid E. O'Brien       static const bool is_signed = false;
48500db7afdSDavid E. O'Brien       static const bool is_integer = true;
48600db7afdSDavid E. O'Brien       static const bool is_exact = true;
48700db7afdSDavid E. O'Brien       static const int radix = 2;
48800db7afdSDavid E. O'Brien       static unsigned char epsilon() throw()
48900db7afdSDavid E. O'Brien       { return 0; }
49000db7afdSDavid E. O'Brien       static unsigned char round_error() throw()
49100db7afdSDavid E. O'Brien       { return 0; }
49200db7afdSDavid E. O'Brien 
49300db7afdSDavid E. O'Brien       static const int min_exponent = 0;
49400db7afdSDavid E. O'Brien       static const int min_exponent10 = 0;
49500db7afdSDavid E. O'Brien       static const int max_exponent = 0;
49600db7afdSDavid E. O'Brien       static const int max_exponent10 = 0;
49700db7afdSDavid E. O'Brien 
49800db7afdSDavid E. O'Brien       static const bool has_infinity = false;
49900db7afdSDavid E. O'Brien       static const bool has_quiet_NaN = false;
50000db7afdSDavid E. O'Brien       static const bool has_signaling_NaN = false;
50100db7afdSDavid E. O'Brien       static const float_denorm_style has_denorm = denorm_absent;
50200db7afdSDavid E. O'Brien       static const bool has_denorm_loss = false;
50300db7afdSDavid E. O'Brien 
50400db7afdSDavid E. O'Brien       static unsigned char infinity() throw()
50500db7afdSDavid E. O'Brien       { return static_cast<unsigned char>(0); }
50600db7afdSDavid E. O'Brien       static unsigned char quiet_NaN() throw()
50700db7afdSDavid E. O'Brien       { return static_cast<unsigned char>(0); }
50800db7afdSDavid E. O'Brien       static unsigned char signaling_NaN() throw()
50900db7afdSDavid E. O'Brien       { return static_cast<unsigned char>(0); }
51000db7afdSDavid E. O'Brien       static unsigned char denorm_min() throw()
51100db7afdSDavid E. O'Brien       { return static_cast<unsigned char>(0); }
51200db7afdSDavid E. O'Brien 
51300db7afdSDavid E. O'Brien       static const bool is_iec559 = false;
51400db7afdSDavid E. O'Brien       static const bool is_bounded = true;
51500db7afdSDavid E. O'Brien       static const bool is_modulo = true;
51600db7afdSDavid E. O'Brien 
517ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_integral_traps;
51800db7afdSDavid E. O'Brien       static const bool tinyness_before = false;
51900db7afdSDavid E. O'Brien       static const float_round_style round_style = round_toward_zero;
52000db7afdSDavid E. O'Brien     };
52100db7afdSDavid E. O'Brien 
522f8a1b7d9SAlexander Kabaev   /// numeric_limits<wchar_t> specialization.
52300db7afdSDavid E. O'Brien   template<>
52400db7afdSDavid E. O'Brien     struct numeric_limits<wchar_t>
52500db7afdSDavid E. O'Brien     {
52600db7afdSDavid E. O'Brien       static const bool is_specialized = true;
52700db7afdSDavid E. O'Brien 
52800db7afdSDavid E. O'Brien       static wchar_t min() throw()
529ffeaf689SAlexander Kabaev       { return __glibcxx_min (wchar_t); }
53000db7afdSDavid E. O'Brien       static wchar_t max() throw()
531ffeaf689SAlexander Kabaev       { return __glibcxx_max (wchar_t); }
53200db7afdSDavid E. O'Brien 
533ffeaf689SAlexander Kabaev       static const int digits = __glibcxx_digits (wchar_t);
534ffeaf689SAlexander Kabaev       static const int digits10 = __glibcxx_digits10 (wchar_t);
535ffeaf689SAlexander Kabaev       static const bool is_signed = __glibcxx_signed (wchar_t);
53600db7afdSDavid E. O'Brien       static const bool is_integer = true;
53700db7afdSDavid E. O'Brien       static const bool is_exact = true;
53800db7afdSDavid E. O'Brien       static const int radix = 2;
53900db7afdSDavid E. O'Brien       static wchar_t epsilon() throw()
54000db7afdSDavid E. O'Brien       { return 0; }
54100db7afdSDavid E. O'Brien       static wchar_t round_error() throw()
54200db7afdSDavid E. O'Brien       { return 0; }
54300db7afdSDavid E. O'Brien 
54400db7afdSDavid E. O'Brien       static const int min_exponent = 0;
54500db7afdSDavid E. O'Brien       static const int min_exponent10 = 0;
54600db7afdSDavid E. O'Brien       static const int max_exponent = 0;
54700db7afdSDavid E. O'Brien       static const int max_exponent10 = 0;
54800db7afdSDavid E. O'Brien 
54900db7afdSDavid E. O'Brien       static const bool has_infinity = false;
55000db7afdSDavid E. O'Brien       static const bool has_quiet_NaN = false;
55100db7afdSDavid E. O'Brien       static const bool has_signaling_NaN = false;
55200db7afdSDavid E. O'Brien       static const float_denorm_style has_denorm = denorm_absent;
55300db7afdSDavid E. O'Brien       static const bool has_denorm_loss = false;
55400db7afdSDavid E. O'Brien 
55500db7afdSDavid E. O'Brien       static wchar_t infinity() throw()
55600db7afdSDavid E. O'Brien       { return wchar_t(); }
55700db7afdSDavid E. O'Brien       static wchar_t quiet_NaN() throw()
55800db7afdSDavid E. O'Brien       { return wchar_t(); }
55900db7afdSDavid E. O'Brien       static wchar_t signaling_NaN() throw()
56000db7afdSDavid E. O'Brien       { return wchar_t(); }
56100db7afdSDavid E. O'Brien       static wchar_t denorm_min() throw()
56200db7afdSDavid E. O'Brien       { return wchar_t(); }
56300db7afdSDavid E. O'Brien 
56400db7afdSDavid E. O'Brien       static const bool is_iec559 = false;
56500db7afdSDavid E. O'Brien       static const bool is_bounded = true;
5661b86b14eSAlexander Kabaev       static const bool is_modulo = true;
56700db7afdSDavid E. O'Brien 
568ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_integral_traps;
56900db7afdSDavid E. O'Brien       static const bool tinyness_before = false;
57000db7afdSDavid E. O'Brien       static const float_round_style round_style = round_toward_zero;
57100db7afdSDavid E. O'Brien     };
57200db7afdSDavid E. O'Brien 
573f8a1b7d9SAlexander Kabaev   /// numeric_limits<short> specialization.
57400db7afdSDavid E. O'Brien   template<>
57500db7afdSDavid E. O'Brien     struct numeric_limits<short>
57600db7afdSDavid E. O'Brien     {
57700db7afdSDavid E. O'Brien       static const bool is_specialized = true;
57800db7afdSDavid E. O'Brien 
57900db7afdSDavid E. O'Brien       static short min() throw()
5801b86b14eSAlexander Kabaev       { return -__SHRT_MAX__ - 1; }
58100db7afdSDavid E. O'Brien       static short max() throw()
5821b86b14eSAlexander Kabaev       { return __SHRT_MAX__; }
58300db7afdSDavid E. O'Brien 
584ffeaf689SAlexander Kabaev       static const int digits = __glibcxx_digits (short);
585ffeaf689SAlexander Kabaev       static const int digits10 = __glibcxx_digits10 (short);
58600db7afdSDavid E. O'Brien       static const bool is_signed = true;
58700db7afdSDavid E. O'Brien       static const bool is_integer = true;
58800db7afdSDavid E. O'Brien       static const bool is_exact = true;
58900db7afdSDavid E. O'Brien       static const int radix = 2;
59000db7afdSDavid E. O'Brien       static short epsilon() throw()
59100db7afdSDavid E. O'Brien       { return 0; }
59200db7afdSDavid E. O'Brien       static short round_error() throw()
59300db7afdSDavid E. O'Brien       { return 0; }
59400db7afdSDavid E. O'Brien 
59500db7afdSDavid E. O'Brien       static const int min_exponent = 0;
59600db7afdSDavid E. O'Brien       static const int min_exponent10 = 0;
59700db7afdSDavid E. O'Brien       static const int max_exponent = 0;
59800db7afdSDavid E. O'Brien       static const int max_exponent10 = 0;
59900db7afdSDavid E. O'Brien 
60000db7afdSDavid E. O'Brien       static const bool has_infinity = false;
60100db7afdSDavid E. O'Brien       static const bool has_quiet_NaN = false;
60200db7afdSDavid E. O'Brien       static const bool has_signaling_NaN = false;
60300db7afdSDavid E. O'Brien       static const float_denorm_style has_denorm = denorm_absent;
60400db7afdSDavid E. O'Brien       static const bool has_denorm_loss = false;
60500db7afdSDavid E. O'Brien 
60600db7afdSDavid E. O'Brien       static short infinity() throw()
60700db7afdSDavid E. O'Brien       { return short(); }
60800db7afdSDavid E. O'Brien       static short quiet_NaN() throw()
60900db7afdSDavid E. O'Brien       { return short(); }
61000db7afdSDavid E. O'Brien       static short signaling_NaN() throw()
61100db7afdSDavid E. O'Brien       { return short(); }
61200db7afdSDavid E. O'Brien       static short denorm_min() throw()
61300db7afdSDavid E. O'Brien       { return short(); }
61400db7afdSDavid E. O'Brien 
6151b86b14eSAlexander Kabaev       static const bool is_iec559 = false;
61600db7afdSDavid E. O'Brien       static const bool is_bounded = true;
6171b86b14eSAlexander Kabaev       static const bool is_modulo = true;
61800db7afdSDavid E. O'Brien 
619ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_integral_traps;
62000db7afdSDavid E. O'Brien       static const bool tinyness_before = false;
62100db7afdSDavid E. O'Brien       static const float_round_style round_style = round_toward_zero;
62200db7afdSDavid E. O'Brien     };
62300db7afdSDavid E. O'Brien 
624f8a1b7d9SAlexander Kabaev   /// numeric_limits<unsigned short> specialization.
62500db7afdSDavid E. O'Brien   template<>
62600db7afdSDavid E. O'Brien     struct numeric_limits<unsigned short>
62700db7afdSDavid E. O'Brien     {
62800db7afdSDavid E. O'Brien       static const bool is_specialized = true;
62900db7afdSDavid E. O'Brien 
63000db7afdSDavid E. O'Brien       static unsigned short min() throw()
63100db7afdSDavid E. O'Brien       { return 0; }
63200db7afdSDavid E. O'Brien       static unsigned short max() throw()
6331b86b14eSAlexander Kabaev       { return __SHRT_MAX__ * 2U + 1; }
63400db7afdSDavid E. O'Brien 
635ffeaf689SAlexander Kabaev       static const int digits = __glibcxx_digits (unsigned short);
636ffeaf689SAlexander Kabaev       static const int digits10 = __glibcxx_digits10 (unsigned short);
63700db7afdSDavid E. O'Brien       static const bool is_signed = false;
63800db7afdSDavid E. O'Brien       static const bool is_integer = true;
63900db7afdSDavid E. O'Brien       static const bool is_exact = true;
64000db7afdSDavid E. O'Brien       static const int radix = 2;
64100db7afdSDavid E. O'Brien       static unsigned short epsilon() throw()
64200db7afdSDavid E. O'Brien       { return 0; }
64300db7afdSDavid E. O'Brien       static unsigned short round_error() throw()
64400db7afdSDavid E. O'Brien       { return 0; }
64500db7afdSDavid E. O'Brien 
64600db7afdSDavid E. O'Brien       static const int min_exponent = 0;
64700db7afdSDavid E. O'Brien       static const int min_exponent10 = 0;
64800db7afdSDavid E. O'Brien       static const int max_exponent = 0;
64900db7afdSDavid E. O'Brien       static const int max_exponent10 = 0;
65000db7afdSDavid E. O'Brien 
65100db7afdSDavid E. O'Brien       static const bool has_infinity = false;
65200db7afdSDavid E. O'Brien       static const bool has_quiet_NaN = false;
65300db7afdSDavid E. O'Brien       static const bool has_signaling_NaN = false;
65400db7afdSDavid E. O'Brien       static const float_denorm_style has_denorm = denorm_absent;
65500db7afdSDavid E. O'Brien       static const bool has_denorm_loss = false;
65600db7afdSDavid E. O'Brien 
65700db7afdSDavid E. O'Brien       static unsigned short infinity() throw()
65800db7afdSDavid E. O'Brien       { return static_cast<unsigned short>(0); }
65900db7afdSDavid E. O'Brien       static unsigned short quiet_NaN() throw()
66000db7afdSDavid E. O'Brien       { return static_cast<unsigned short>(0); }
66100db7afdSDavid E. O'Brien       static unsigned short signaling_NaN() throw()
66200db7afdSDavid E. O'Brien       { return static_cast<unsigned short>(0); }
66300db7afdSDavid E. O'Brien       static unsigned short denorm_min() throw()
66400db7afdSDavid E. O'Brien       { return static_cast<unsigned short>(0); }
66500db7afdSDavid E. O'Brien 
6661b86b14eSAlexander Kabaev       static const bool is_iec559 = false;
66700db7afdSDavid E. O'Brien       static const bool is_bounded = true;
66800db7afdSDavid E. O'Brien       static const bool is_modulo = true;
66900db7afdSDavid E. O'Brien 
670ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_integral_traps;
67100db7afdSDavid E. O'Brien       static const bool tinyness_before = false;
67200db7afdSDavid E. O'Brien       static const float_round_style round_style = round_toward_zero;
67300db7afdSDavid E. O'Brien     };
67400db7afdSDavid E. O'Brien 
675f8a1b7d9SAlexander Kabaev   /// numeric_limits<int> specialization.
67600db7afdSDavid E. O'Brien   template<>
67700db7afdSDavid E. O'Brien     struct numeric_limits<int>
67800db7afdSDavid E. O'Brien     {
67900db7afdSDavid E. O'Brien       static const bool is_specialized = true;
68000db7afdSDavid E. O'Brien 
68100db7afdSDavid E. O'Brien       static int min() throw()
6821b86b14eSAlexander Kabaev       { return -__INT_MAX__ - 1; }
68300db7afdSDavid E. O'Brien       static int max() throw()
6841b86b14eSAlexander Kabaev       { return __INT_MAX__; }
68500db7afdSDavid E. O'Brien 
686ffeaf689SAlexander Kabaev       static const int digits = __glibcxx_digits (int);
687ffeaf689SAlexander Kabaev       static const int digits10 = __glibcxx_digits10 (int);
68800db7afdSDavid E. O'Brien       static const bool is_signed = true;
68900db7afdSDavid E. O'Brien       static const bool is_integer = true;
69000db7afdSDavid E. O'Brien       static const bool is_exact = true;
69100db7afdSDavid E. O'Brien       static const int radix = 2;
69200db7afdSDavid E. O'Brien       static int epsilon() throw()
69300db7afdSDavid E. O'Brien       { return 0; }
69400db7afdSDavid E. O'Brien       static int round_error() throw()
69500db7afdSDavid E. O'Brien       { return 0; }
69600db7afdSDavid E. O'Brien 
69700db7afdSDavid E. O'Brien       static const int min_exponent = 0;
69800db7afdSDavid E. O'Brien       static const int min_exponent10 = 0;
69900db7afdSDavid E. O'Brien       static const int max_exponent = 0;
70000db7afdSDavid E. O'Brien       static const int max_exponent10 = 0;
70100db7afdSDavid E. O'Brien 
70200db7afdSDavid E. O'Brien       static const bool has_infinity = false;
70300db7afdSDavid E. O'Brien       static const bool has_quiet_NaN = false;
70400db7afdSDavid E. O'Brien       static const bool has_signaling_NaN = false;
70500db7afdSDavid E. O'Brien       static const float_denorm_style has_denorm = denorm_absent;
70600db7afdSDavid E. O'Brien       static const bool has_denorm_loss = false;
70700db7afdSDavid E. O'Brien 
70800db7afdSDavid E. O'Brien       static int infinity() throw()
70900db7afdSDavid E. O'Brien       { return static_cast<int>(0); }
71000db7afdSDavid E. O'Brien       static int quiet_NaN() throw()
71100db7afdSDavid E. O'Brien       { return static_cast<int>(0); }
71200db7afdSDavid E. O'Brien       static int signaling_NaN() throw()
71300db7afdSDavid E. O'Brien       { return static_cast<int>(0); }
71400db7afdSDavid E. O'Brien       static int denorm_min() throw()
71500db7afdSDavid E. O'Brien       { return static_cast<int>(0); }
71600db7afdSDavid E. O'Brien 
7171b86b14eSAlexander Kabaev       static const bool is_iec559 = false;
71800db7afdSDavid E. O'Brien       static const bool is_bounded = true;
7191b86b14eSAlexander Kabaev       static const bool is_modulo = true;
72000db7afdSDavid E. O'Brien 
721ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_integral_traps;
72200db7afdSDavid E. O'Brien       static const bool tinyness_before = false;
72300db7afdSDavid E. O'Brien       static const float_round_style round_style = round_toward_zero;
72400db7afdSDavid E. O'Brien     };
72500db7afdSDavid E. O'Brien 
726f8a1b7d9SAlexander Kabaev   /// numeric_limits<unsigned int> specialization.
72700db7afdSDavid E. O'Brien   template<>
72800db7afdSDavid E. O'Brien     struct numeric_limits<unsigned int>
72900db7afdSDavid E. O'Brien     {
73000db7afdSDavid E. O'Brien       static const bool is_specialized = true;
73100db7afdSDavid E. O'Brien 
73200db7afdSDavid E. O'Brien       static unsigned int min() throw()
73300db7afdSDavid E. O'Brien       { return 0; }
73400db7afdSDavid E. O'Brien       static unsigned int max() throw()
7351b86b14eSAlexander Kabaev       { return __INT_MAX__ * 2U + 1; }
73600db7afdSDavid E. O'Brien 
737ffeaf689SAlexander Kabaev       static const int digits = __glibcxx_digits (unsigned int);
738ffeaf689SAlexander Kabaev       static const int digits10 = __glibcxx_digits10 (unsigned int);
73900db7afdSDavid E. O'Brien       static const bool is_signed = false;
74000db7afdSDavid E. O'Brien       static const bool is_integer = true;
74100db7afdSDavid E. O'Brien       static const bool is_exact = true;
74200db7afdSDavid E. O'Brien       static const int radix = 2;
74300db7afdSDavid E. O'Brien       static unsigned int epsilon() throw()
74400db7afdSDavid E. O'Brien       { return 0; }
74500db7afdSDavid E. O'Brien       static unsigned int round_error() throw()
74600db7afdSDavid E. O'Brien       { return 0; }
74700db7afdSDavid E. O'Brien 
74800db7afdSDavid E. O'Brien       static const int min_exponent = 0;
74900db7afdSDavid E. O'Brien       static const int min_exponent10 = 0;
75000db7afdSDavid E. O'Brien       static const int max_exponent = 0;
75100db7afdSDavid E. O'Brien       static const int max_exponent10 = 0;
75200db7afdSDavid E. O'Brien 
75300db7afdSDavid E. O'Brien       static const bool has_infinity = false;
75400db7afdSDavid E. O'Brien       static const bool has_quiet_NaN = false;
75500db7afdSDavid E. O'Brien       static const bool has_signaling_NaN = false;
75600db7afdSDavid E. O'Brien       static const float_denorm_style has_denorm = denorm_absent;
75700db7afdSDavid E. O'Brien       static const bool has_denorm_loss = false;
75800db7afdSDavid E. O'Brien 
75900db7afdSDavid E. O'Brien       static unsigned int infinity() throw()
76000db7afdSDavid E. O'Brien       { return static_cast<unsigned int>(0); }
76100db7afdSDavid E. O'Brien       static unsigned int quiet_NaN() throw()
76200db7afdSDavid E. O'Brien       { return static_cast<unsigned int>(0); }
76300db7afdSDavid E. O'Brien       static unsigned int signaling_NaN() throw()
76400db7afdSDavid E. O'Brien       { return static_cast<unsigned int>(0); }
76500db7afdSDavid E. O'Brien       static unsigned int denorm_min() throw()
76600db7afdSDavid E. O'Brien       { return static_cast<unsigned int>(0); }
76700db7afdSDavid E. O'Brien 
7681b86b14eSAlexander Kabaev       static const bool is_iec559 = false;
76900db7afdSDavid E. O'Brien       static const bool is_bounded = true;
77000db7afdSDavid E. O'Brien       static const bool is_modulo = true;
77100db7afdSDavid E. O'Brien 
772ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_integral_traps;
77300db7afdSDavid E. O'Brien       static const bool tinyness_before = false;
77400db7afdSDavid E. O'Brien       static const float_round_style round_style = round_toward_zero;
77500db7afdSDavid E. O'Brien     };
77600db7afdSDavid E. O'Brien 
777f8a1b7d9SAlexander Kabaev   /// numeric_limits<long> specialization.
77800db7afdSDavid E. O'Brien   template<>
77900db7afdSDavid E. O'Brien     struct numeric_limits<long>
78000db7afdSDavid E. O'Brien     {
78100db7afdSDavid E. O'Brien       static const bool is_specialized = true;
78200db7afdSDavid E. O'Brien 
78300db7afdSDavid E. O'Brien       static long min() throw()
7841b86b14eSAlexander Kabaev       { return -__LONG_MAX__ - 1; }
78500db7afdSDavid E. O'Brien       static long max() throw()
7861b86b14eSAlexander Kabaev       { return __LONG_MAX__; }
78700db7afdSDavid E. O'Brien 
788ffeaf689SAlexander Kabaev       static const int digits = __glibcxx_digits (long);
789ffeaf689SAlexander Kabaev       static const int digits10 = __glibcxx_digits10 (long);
79000db7afdSDavid E. O'Brien       static const bool is_signed = true;
79100db7afdSDavid E. O'Brien       static const bool is_integer = true;
79200db7afdSDavid E. O'Brien       static const bool is_exact = true;
79300db7afdSDavid E. O'Brien       static const int radix = 2;
79400db7afdSDavid E. O'Brien       static long epsilon() throw()
79500db7afdSDavid E. O'Brien       { return 0; }
79600db7afdSDavid E. O'Brien       static long round_error() throw()
79700db7afdSDavid E. O'Brien       { return 0; }
79800db7afdSDavid E. O'Brien 
79900db7afdSDavid E. O'Brien       static const int min_exponent = 0;
80000db7afdSDavid E. O'Brien       static const int min_exponent10 = 0;
80100db7afdSDavid E. O'Brien       static const int max_exponent = 0;
80200db7afdSDavid E. O'Brien       static const int max_exponent10 = 0;
80300db7afdSDavid E. O'Brien 
80400db7afdSDavid E. O'Brien       static const bool has_infinity = false;
80500db7afdSDavid E. O'Brien       static const bool has_quiet_NaN = false;
80600db7afdSDavid E. O'Brien       static const bool has_signaling_NaN = false;
80700db7afdSDavid E. O'Brien       static const float_denorm_style has_denorm = denorm_absent;
80800db7afdSDavid E. O'Brien       static const bool has_denorm_loss = false;
80900db7afdSDavid E. O'Brien 
81000db7afdSDavid E. O'Brien       static long infinity() throw()
81100db7afdSDavid E. O'Brien       { return static_cast<long>(0); }
81200db7afdSDavid E. O'Brien       static long quiet_NaN() throw()
81300db7afdSDavid E. O'Brien       { return static_cast<long>(0); }
81400db7afdSDavid E. O'Brien       static long signaling_NaN() throw()
81500db7afdSDavid E. O'Brien       { return static_cast<long>(0); }
81600db7afdSDavid E. O'Brien       static long denorm_min() throw()
81700db7afdSDavid E. O'Brien       { return static_cast<long>(0); }
81800db7afdSDavid E. O'Brien 
8191b86b14eSAlexander Kabaev       static const bool is_iec559 = false;
82000db7afdSDavid E. O'Brien       static const bool is_bounded = true;
8211b86b14eSAlexander Kabaev       static const bool is_modulo = true;
82200db7afdSDavid E. O'Brien 
823ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_integral_traps;
82400db7afdSDavid E. O'Brien       static const bool tinyness_before = false;
82500db7afdSDavid E. O'Brien       static const float_round_style round_style = round_toward_zero;
82600db7afdSDavid E. O'Brien     };
82700db7afdSDavid E. O'Brien 
828f8a1b7d9SAlexander Kabaev   /// numeric_limits<unsigned long> specialization.
82900db7afdSDavid E. O'Brien   template<>
83000db7afdSDavid E. O'Brien     struct numeric_limits<unsigned long>
83100db7afdSDavid E. O'Brien     {
83200db7afdSDavid E. O'Brien       static const bool is_specialized = true;
83300db7afdSDavid E. O'Brien 
83400db7afdSDavid E. O'Brien       static unsigned long min() throw()
83500db7afdSDavid E. O'Brien       { return 0; }
83600db7afdSDavid E. O'Brien       static unsigned long max() throw()
8371b86b14eSAlexander Kabaev       { return __LONG_MAX__ * 2UL + 1; }
83800db7afdSDavid E. O'Brien 
839ffeaf689SAlexander Kabaev       static const int digits = __glibcxx_digits (unsigned long);
840ffeaf689SAlexander Kabaev       static const int digits10 = __glibcxx_digits10 (unsigned long);
84100db7afdSDavid E. O'Brien       static const bool is_signed = false;
84200db7afdSDavid E. O'Brien       static const bool is_integer = true;
84300db7afdSDavid E. O'Brien       static const bool is_exact = true;
84400db7afdSDavid E. O'Brien       static const int radix = 2;
84500db7afdSDavid E. O'Brien       static unsigned long epsilon() throw()
84600db7afdSDavid E. O'Brien       { return 0; }
84700db7afdSDavid E. O'Brien       static unsigned long round_error() throw()
84800db7afdSDavid E. O'Brien       { return 0; }
84900db7afdSDavid E. O'Brien 
85000db7afdSDavid E. O'Brien       static const int min_exponent = 0;
85100db7afdSDavid E. O'Brien       static const int min_exponent10 = 0;
85200db7afdSDavid E. O'Brien       static const int max_exponent = 0;
85300db7afdSDavid E. O'Brien       static const int max_exponent10 = 0;
85400db7afdSDavid E. O'Brien 
85500db7afdSDavid E. O'Brien       static const bool has_infinity = false;
85600db7afdSDavid E. O'Brien       static const bool has_quiet_NaN = false;
85700db7afdSDavid E. O'Brien       static const bool has_signaling_NaN = false;
85800db7afdSDavid E. O'Brien       static const float_denorm_style has_denorm = denorm_absent;
85900db7afdSDavid E. O'Brien       static const bool has_denorm_loss = false;
86000db7afdSDavid E. O'Brien 
86100db7afdSDavid E. O'Brien       static unsigned long infinity() throw()
86200db7afdSDavid E. O'Brien       { return static_cast<unsigned long>(0); }
86300db7afdSDavid E. O'Brien       static unsigned long quiet_NaN() throw()
86400db7afdSDavid E. O'Brien       { return static_cast<unsigned long>(0); }
86500db7afdSDavid E. O'Brien       static unsigned long signaling_NaN() throw()
86600db7afdSDavid E. O'Brien       { return static_cast<unsigned long>(0); }
86700db7afdSDavid E. O'Brien       static unsigned long denorm_min() throw()
86800db7afdSDavid E. O'Brien       { return static_cast<unsigned long>(0); }
86900db7afdSDavid E. O'Brien 
8701b86b14eSAlexander Kabaev       static const bool is_iec559 = false;
87100db7afdSDavid E. O'Brien       static const bool is_bounded = true;
87200db7afdSDavid E. O'Brien       static const bool is_modulo = true;
87300db7afdSDavid E. O'Brien 
874ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_integral_traps;
87500db7afdSDavid E. O'Brien       static const bool tinyness_before = false;
87600db7afdSDavid E. O'Brien       static const float_round_style round_style = round_toward_zero;
87700db7afdSDavid E. O'Brien     };
87800db7afdSDavid E. O'Brien 
879f8a1b7d9SAlexander Kabaev   /// numeric_limits<long long> specialization.
88000db7afdSDavid E. O'Brien   template<>
88100db7afdSDavid E. O'Brien     struct numeric_limits<long long>
88200db7afdSDavid E. O'Brien     {
88300db7afdSDavid E. O'Brien       static const bool is_specialized = true;
88400db7afdSDavid E. O'Brien 
88500db7afdSDavid E. O'Brien       static long long min() throw()
8861b86b14eSAlexander Kabaev       { return -__LONG_LONG_MAX__ - 1; }
88700db7afdSDavid E. O'Brien       static long long max() throw()
8881b86b14eSAlexander Kabaev       { return __LONG_LONG_MAX__; }
88900db7afdSDavid E. O'Brien 
890ffeaf689SAlexander Kabaev       static const int digits = __glibcxx_digits (long long);
891ffeaf689SAlexander Kabaev       static const int digits10 = __glibcxx_digits10 (long long);
89200db7afdSDavid E. O'Brien       static const bool is_signed = true;
89300db7afdSDavid E. O'Brien       static const bool is_integer = true;
89400db7afdSDavid E. O'Brien       static const bool is_exact = true;
89500db7afdSDavid E. O'Brien       static const int radix = 2;
89600db7afdSDavid E. O'Brien       static long long epsilon() throw()
89700db7afdSDavid E. O'Brien       { return 0; }
89800db7afdSDavid E. O'Brien       static long long round_error() throw()
89900db7afdSDavid E. O'Brien       { return 0; }
90000db7afdSDavid E. O'Brien 
90100db7afdSDavid E. O'Brien       static const int min_exponent = 0;
90200db7afdSDavid E. O'Brien       static const int min_exponent10 = 0;
90300db7afdSDavid E. O'Brien       static const int max_exponent = 0;
90400db7afdSDavid E. O'Brien       static const int max_exponent10 = 0;
90500db7afdSDavid E. O'Brien 
90600db7afdSDavid E. O'Brien       static const bool has_infinity = false;
90700db7afdSDavid E. O'Brien       static const bool has_quiet_NaN = false;
90800db7afdSDavid E. O'Brien       static const bool has_signaling_NaN = false;
90900db7afdSDavid E. O'Brien       static const float_denorm_style has_denorm = denorm_absent;
91000db7afdSDavid E. O'Brien       static const bool has_denorm_loss = false;
91100db7afdSDavid E. O'Brien 
91200db7afdSDavid E. O'Brien       static long long infinity() throw()
91300db7afdSDavid E. O'Brien       { return static_cast<long long>(0); }
91400db7afdSDavid E. O'Brien       static long long quiet_NaN() throw()
91500db7afdSDavid E. O'Brien       { return static_cast<long long>(0); }
91600db7afdSDavid E. O'Brien       static long long signaling_NaN() throw()
91700db7afdSDavid E. O'Brien       { return static_cast<long long>(0); }
91800db7afdSDavid E. O'Brien       static long long denorm_min() throw()
91900db7afdSDavid E. O'Brien       { return static_cast<long long>(0); }
92000db7afdSDavid E. O'Brien 
9211b86b14eSAlexander Kabaev       static const bool is_iec559 = false;
92200db7afdSDavid E. O'Brien       static const bool is_bounded = true;
9231b86b14eSAlexander Kabaev       static const bool is_modulo = true;
92400db7afdSDavid E. O'Brien 
925ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_integral_traps;
92600db7afdSDavid E. O'Brien       static const bool tinyness_before = false;
92700db7afdSDavid E. O'Brien       static const float_round_style round_style = round_toward_zero;
92800db7afdSDavid E. O'Brien     };
92900db7afdSDavid E. O'Brien 
930f8a1b7d9SAlexander Kabaev   /// numeric_limits<unsigned long long> specialization.
93100db7afdSDavid E. O'Brien   template<>
93200db7afdSDavid E. O'Brien     struct numeric_limits<unsigned long long>
93300db7afdSDavid E. O'Brien     {
93400db7afdSDavid E. O'Brien       static const bool is_specialized = true;
93500db7afdSDavid E. O'Brien 
93600db7afdSDavid E. O'Brien       static unsigned long long min() throw()
93700db7afdSDavid E. O'Brien       { return 0; }
93800db7afdSDavid E. O'Brien       static unsigned long long max() throw()
9391b86b14eSAlexander Kabaev       { return __LONG_LONG_MAX__ * 2ULL + 1; }
94000db7afdSDavid E. O'Brien 
941ffeaf689SAlexander Kabaev       static const int digits = __glibcxx_digits (unsigned long long);
942ffeaf689SAlexander Kabaev       static const int digits10 = __glibcxx_digits10 (unsigned long long);
94300db7afdSDavid E. O'Brien       static const bool is_signed = false;
94400db7afdSDavid E. O'Brien       static const bool is_integer = true;
94500db7afdSDavid E. O'Brien       static const bool is_exact = true;
94600db7afdSDavid E. O'Brien       static const int radix = 2;
94700db7afdSDavid E. O'Brien       static unsigned long long epsilon() throw()
94800db7afdSDavid E. O'Brien       { return 0; }
94900db7afdSDavid E. O'Brien       static unsigned long long round_error() throw()
95000db7afdSDavid E. O'Brien       { return 0; }
95100db7afdSDavid E. O'Brien 
95200db7afdSDavid E. O'Brien       static const int min_exponent = 0;
95300db7afdSDavid E. O'Brien       static const int min_exponent10 = 0;
95400db7afdSDavid E. O'Brien       static const int max_exponent = 0;
95500db7afdSDavid E. O'Brien       static const int max_exponent10 = 0;
95600db7afdSDavid E. O'Brien 
95700db7afdSDavid E. O'Brien       static const bool has_infinity = false;
95800db7afdSDavid E. O'Brien       static const bool has_quiet_NaN = false;
95900db7afdSDavid E. O'Brien       static const bool has_signaling_NaN = false;
96000db7afdSDavid E. O'Brien       static const float_denorm_style has_denorm = denorm_absent;
96100db7afdSDavid E. O'Brien       static const bool has_denorm_loss = false;
96200db7afdSDavid E. O'Brien 
96300db7afdSDavid E. O'Brien       static unsigned long long infinity() throw()
96400db7afdSDavid E. O'Brien       { return static_cast<unsigned long long>(0); }
96500db7afdSDavid E. O'Brien       static unsigned long long quiet_NaN() throw()
96600db7afdSDavid E. O'Brien       { return static_cast<unsigned long long>(0); }
96700db7afdSDavid E. O'Brien       static unsigned long long signaling_NaN() throw()
96800db7afdSDavid E. O'Brien       { return static_cast<unsigned long long>(0); }
96900db7afdSDavid E. O'Brien       static unsigned long long denorm_min() throw()
97000db7afdSDavid E. O'Brien       { return static_cast<unsigned long long>(0); }
97100db7afdSDavid E. O'Brien 
9721b86b14eSAlexander Kabaev       static const bool is_iec559 = false;
97300db7afdSDavid E. O'Brien       static const bool is_bounded = true;
97400db7afdSDavid E. O'Brien       static const bool is_modulo = true;
97500db7afdSDavid E. O'Brien 
976ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_integral_traps;
97700db7afdSDavid E. O'Brien       static const bool tinyness_before = false;
97800db7afdSDavid E. O'Brien       static const float_round_style round_style = round_toward_zero;
97900db7afdSDavid E. O'Brien     };
98000db7afdSDavid E. O'Brien 
981f8a1b7d9SAlexander Kabaev   /// numeric_limits<float> specialization.
98200db7afdSDavid E. O'Brien   template<>
98300db7afdSDavid E. O'Brien     struct numeric_limits<float>
98400db7afdSDavid E. O'Brien     {
98500db7afdSDavid E. O'Brien       static const bool is_specialized = true;
98600db7afdSDavid E. O'Brien 
98700db7afdSDavid E. O'Brien       static float min() throw()
9881b86b14eSAlexander Kabaev       { return __FLT_MIN__; }
98900db7afdSDavid E. O'Brien       static float max() throw()
9901b86b14eSAlexander Kabaev       { return __FLT_MAX__; }
99100db7afdSDavid E. O'Brien 
9921b86b14eSAlexander Kabaev       static const int digits = __FLT_MANT_DIG__;
9931b86b14eSAlexander Kabaev       static const int digits10 = __FLT_DIG__;
99400db7afdSDavid E. O'Brien       static const bool is_signed = true;
99500db7afdSDavid E. O'Brien       static const bool is_integer = false;
99600db7afdSDavid E. O'Brien       static const bool is_exact = false;
9971b86b14eSAlexander Kabaev       static const int radix = __FLT_RADIX__;
99800db7afdSDavid E. O'Brien       static float epsilon() throw()
9991b86b14eSAlexander Kabaev       { return __FLT_EPSILON__; }
100000db7afdSDavid E. O'Brien       static float round_error() throw()
10011b86b14eSAlexander Kabaev       { return 0.5F; }
100200db7afdSDavid E. O'Brien 
10031b86b14eSAlexander Kabaev       static const int min_exponent = __FLT_MIN_EXP__;
10041b86b14eSAlexander Kabaev       static const int min_exponent10 = __FLT_MIN_10_EXP__;
10051b86b14eSAlexander Kabaev       static const int max_exponent = __FLT_MAX_EXP__;
10061b86b14eSAlexander Kabaev       static const int max_exponent10 = __FLT_MAX_10_EXP__;
100700db7afdSDavid E. O'Brien 
1008ffeaf689SAlexander Kabaev       static const bool has_infinity = __FLT_HAS_INFINITY__;
1009ffeaf689SAlexander Kabaev       static const bool has_quiet_NaN = __FLT_HAS_QUIET_NAN__;
10101b86b14eSAlexander Kabaev       static const bool has_signaling_NaN = has_quiet_NaN;
10111b86b14eSAlexander Kabaev       static const float_denorm_style has_denorm
1012f8a1b7d9SAlexander Kabaev 	= bool(__FLT_HAS_DENORM__) ? denorm_present : denorm_absent;
1013ffeaf689SAlexander Kabaev       static const bool has_denorm_loss = __glibcxx_float_has_denorm_loss;
101400db7afdSDavid E. O'Brien 
101500db7afdSDavid E. O'Brien       static float infinity() throw()
10161b86b14eSAlexander Kabaev       { return __builtin_huge_valf (); }
101700db7afdSDavid E. O'Brien       static float quiet_NaN() throw()
10181b86b14eSAlexander Kabaev       { return __builtin_nanf (""); }
101900db7afdSDavid E. O'Brien       static float signaling_NaN() throw()
10201b86b14eSAlexander Kabaev       { return __builtin_nansf (""); }
102100db7afdSDavid E. O'Brien       static float denorm_min() throw()
10221b86b14eSAlexander Kabaev       { return __FLT_DENORM_MIN__; }
102300db7afdSDavid E. O'Brien 
10241b86b14eSAlexander Kabaev       static const bool is_iec559
10251b86b14eSAlexander Kabaev 	= has_infinity && has_quiet_NaN && has_denorm == denorm_present;
10261b86b14eSAlexander Kabaev       static const bool is_bounded = true;
10271b86b14eSAlexander Kabaev       static const bool is_modulo = false;
102800db7afdSDavid E. O'Brien 
1029ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_float_traps;
1030ffeaf689SAlexander Kabaev       static const bool tinyness_before = __glibcxx_float_tinyness_before;
10311b86b14eSAlexander Kabaev       static const float_round_style round_style = round_to_nearest;
103200db7afdSDavid E. O'Brien     };
103300db7afdSDavid E. O'Brien 
1034ffeaf689SAlexander Kabaev #undef __glibcxx_float_has_denorm_loss
1035ffeaf689SAlexander Kabaev #undef __glibcxx_float_traps
1036ffeaf689SAlexander Kabaev #undef __glibcxx_float_tinyness_before
103700db7afdSDavid E. O'Brien 
1038f8a1b7d9SAlexander Kabaev   /// numeric_limits<double> specialization.
103900db7afdSDavid E. O'Brien   template<>
104000db7afdSDavid E. O'Brien     struct numeric_limits<double>
104100db7afdSDavid E. O'Brien     {
104200db7afdSDavid E. O'Brien       static const bool is_specialized = true;
104300db7afdSDavid E. O'Brien 
104400db7afdSDavid E. O'Brien       static double min() throw()
10451b86b14eSAlexander Kabaev       { return __DBL_MIN__; }
104600db7afdSDavid E. O'Brien       static double max() throw()
10471b86b14eSAlexander Kabaev       { return __DBL_MAX__; }
104800db7afdSDavid E. O'Brien 
10491b86b14eSAlexander Kabaev       static const int digits = __DBL_MANT_DIG__;
10501b86b14eSAlexander Kabaev       static const int digits10 = __DBL_DIG__;
105100db7afdSDavid E. O'Brien       static const bool is_signed = true;
105200db7afdSDavid E. O'Brien       static const bool is_integer = false;
105300db7afdSDavid E. O'Brien       static const bool is_exact = false;
10541b86b14eSAlexander Kabaev       static const int radix = __FLT_RADIX__;
105500db7afdSDavid E. O'Brien       static double epsilon() throw()
10561b86b14eSAlexander Kabaev       { return __DBL_EPSILON__; }
105700db7afdSDavid E. O'Brien       static double round_error() throw()
10581b86b14eSAlexander Kabaev       { return 0.5; }
105900db7afdSDavid E. O'Brien 
10601b86b14eSAlexander Kabaev       static const int min_exponent = __DBL_MIN_EXP__;
10611b86b14eSAlexander Kabaev       static const int min_exponent10 = __DBL_MIN_10_EXP__;
10621b86b14eSAlexander Kabaev       static const int max_exponent = __DBL_MAX_EXP__;
10631b86b14eSAlexander Kabaev       static const int max_exponent10 = __DBL_MAX_10_EXP__;
106400db7afdSDavid E. O'Brien 
1065ffeaf689SAlexander Kabaev       static const bool has_infinity = __DBL_HAS_INFINITY__;
1066ffeaf689SAlexander Kabaev       static const bool has_quiet_NaN = __DBL_HAS_QUIET_NAN__;
10671b86b14eSAlexander Kabaev       static const bool has_signaling_NaN = has_quiet_NaN;
10681b86b14eSAlexander Kabaev       static const float_denorm_style has_denorm
1069f8a1b7d9SAlexander Kabaev 	= bool(__DBL_HAS_DENORM__) ? denorm_present : denorm_absent;
1070ffeaf689SAlexander Kabaev       static const bool has_denorm_loss = __glibcxx_double_has_denorm_loss;
107100db7afdSDavid E. O'Brien 
107200db7afdSDavid E. O'Brien       static double infinity() throw()
10731b86b14eSAlexander Kabaev       { return __builtin_huge_val(); }
107400db7afdSDavid E. O'Brien       static double quiet_NaN() throw()
10751b86b14eSAlexander Kabaev       { return __builtin_nan (""); }
107600db7afdSDavid E. O'Brien       static double signaling_NaN() throw()
10771b86b14eSAlexander Kabaev       { return __builtin_nans (""); }
107800db7afdSDavid E. O'Brien       static double denorm_min() throw()
10791b86b14eSAlexander Kabaev       { return __DBL_DENORM_MIN__; }
108000db7afdSDavid E. O'Brien 
10811b86b14eSAlexander Kabaev       static const bool is_iec559
10821b86b14eSAlexander Kabaev 	= has_infinity && has_quiet_NaN && has_denorm == denorm_present;
10831b86b14eSAlexander Kabaev       static const bool is_bounded = true;
10841b86b14eSAlexander Kabaev       static const bool is_modulo = false;
108500db7afdSDavid E. O'Brien 
1086ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_double_traps;
1087ffeaf689SAlexander Kabaev       static const bool tinyness_before = __glibcxx_double_tinyness_before;
10881b86b14eSAlexander Kabaev       static const float_round_style round_style = round_to_nearest;
108900db7afdSDavid E. O'Brien     };
109000db7afdSDavid E. O'Brien 
1091ffeaf689SAlexander Kabaev #undef __glibcxx_double_has_denorm_loss
1092ffeaf689SAlexander Kabaev #undef __glibcxx_double_traps
1093ffeaf689SAlexander Kabaev #undef __glibcxx_double_tinyness_before
109400db7afdSDavid E. O'Brien 
1095f8a1b7d9SAlexander Kabaev   /// numeric_limits<long double> specialization.
109600db7afdSDavid E. O'Brien   template<>
109700db7afdSDavid E. O'Brien     struct numeric_limits<long double>
109800db7afdSDavid E. O'Brien     {
109900db7afdSDavid E. O'Brien       static const bool is_specialized = true;
110000db7afdSDavid E. O'Brien 
110100db7afdSDavid E. O'Brien       static long double min() throw()
11021b86b14eSAlexander Kabaev       { return __LDBL_MIN__; }
110300db7afdSDavid E. O'Brien       static long double max() throw()
11041b86b14eSAlexander Kabaev       { return __LDBL_MAX__; }
110500db7afdSDavid E. O'Brien 
11061b86b14eSAlexander Kabaev       static const int digits = __LDBL_MANT_DIG__;
11071b86b14eSAlexander Kabaev       static const int digits10 = __LDBL_DIG__;
110800db7afdSDavid E. O'Brien       static const bool is_signed = true;
110900db7afdSDavid E. O'Brien       static const bool is_integer = false;
111000db7afdSDavid E. O'Brien       static const bool is_exact = false;
11111b86b14eSAlexander Kabaev       static const int radix = __FLT_RADIX__;
111200db7afdSDavid E. O'Brien       static long double epsilon() throw()
11131b86b14eSAlexander Kabaev       { return __LDBL_EPSILON__; }
111400db7afdSDavid E. O'Brien       static long double round_error() throw()
11151b86b14eSAlexander Kabaev       { return 0.5L; }
111600db7afdSDavid E. O'Brien 
11171b86b14eSAlexander Kabaev       static const int min_exponent = __LDBL_MIN_EXP__;
11181b86b14eSAlexander Kabaev       static const int min_exponent10 = __LDBL_MIN_10_EXP__;
11191b86b14eSAlexander Kabaev       static const int max_exponent = __LDBL_MAX_EXP__;
11201b86b14eSAlexander Kabaev       static const int max_exponent10 = __LDBL_MAX_10_EXP__;
112100db7afdSDavid E. O'Brien 
1122ffeaf689SAlexander Kabaev       static const bool has_infinity = __LDBL_HAS_INFINITY__;
1123ffeaf689SAlexander Kabaev       static const bool has_quiet_NaN = __LDBL_HAS_QUIET_NAN__;
11241b86b14eSAlexander Kabaev       static const bool has_signaling_NaN = has_quiet_NaN;
11251b86b14eSAlexander Kabaev       static const float_denorm_style has_denorm
1126f8a1b7d9SAlexander Kabaev 	= bool(__LDBL_HAS_DENORM__) ? denorm_present : denorm_absent;
11271b86b14eSAlexander Kabaev       static const bool has_denorm_loss
1128ffeaf689SAlexander Kabaev 	= __glibcxx_long_double_has_denorm_loss;
112900db7afdSDavid E. O'Brien 
113000db7afdSDavid E. O'Brien       static long double infinity() throw()
11311b86b14eSAlexander Kabaev       { return __builtin_huge_vall (); }
113200db7afdSDavid E. O'Brien       static long double quiet_NaN() throw()
11331b86b14eSAlexander Kabaev       { return __builtin_nanl (""); }
113400db7afdSDavid E. O'Brien       static long double signaling_NaN() throw()
11351b86b14eSAlexander Kabaev       { return __builtin_nansl (""); }
113600db7afdSDavid E. O'Brien       static long double denorm_min() throw()
11371b86b14eSAlexander Kabaev       { return __LDBL_DENORM_MIN__; }
113800db7afdSDavid E. O'Brien 
11391b86b14eSAlexander Kabaev       static const bool is_iec559
11401b86b14eSAlexander Kabaev 	= has_infinity && has_quiet_NaN && has_denorm == denorm_present;
11411b86b14eSAlexander Kabaev       static const bool is_bounded = true;
11421b86b14eSAlexander Kabaev       static const bool is_modulo = false;
114300db7afdSDavid E. O'Brien 
1144ffeaf689SAlexander Kabaev       static const bool traps = __glibcxx_long_double_traps;
1145ffeaf689SAlexander Kabaev       static const bool tinyness_before = __glibcxx_long_double_tinyness_before;
11461b86b14eSAlexander Kabaev       static const float_round_style round_style = round_to_nearest;
114700db7afdSDavid E. O'Brien     };
114800db7afdSDavid E. O'Brien 
1149ffeaf689SAlexander Kabaev #undef __glibcxx_long_double_has_denorm_loss
1150ffeaf689SAlexander Kabaev #undef __glibcxx_long_double_traps
1151ffeaf689SAlexander Kabaev #undef __glibcxx_long_double_tinyness_before
115200db7afdSDavid E. O'Brien 
1153f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
115400db7afdSDavid E. O'Brien 
1155ffeaf689SAlexander Kabaev #undef __glibcxx_signed
1156ffeaf689SAlexander Kabaev #undef __glibcxx_min
1157ffeaf689SAlexander Kabaev #undef __glibcxx_max
1158ffeaf689SAlexander Kabaev #undef __glibcxx_digits
1159ffeaf689SAlexander Kabaev #undef __glibcxx_digits10
11601b86b14eSAlexander Kabaev 
1161ffeaf689SAlexander Kabaev #endif // _GLIBCXX_NUMERIC_LIMITS
1162