]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/include/std/limits
PR c++/89336 - multiple stores in constexpr stmt.
[thirdparty/gcc.git] / libstdc++-v3 / include / std / limits
CommitLineData
94a86be0 1// The template and inlines for the numeric_limits classes. -*- C++ -*-
de96ac46 2
a5544970 3// Copyright (C) 1999-2019 Free Software Foundation, Inc.
de96ac46
BK
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
748086b7 8// Free Software Foundation; either version 3, or (at your option)
de96ac46
BK
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
748086b7
JJ
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23// <http://www.gnu.org/licenses/>.
de96ac46 24
f910786b 25/** @file include/limits
0aa06b18
BK
26 * This is a Standard C++ Library header.
27 */
28
54c1bf78
BK
29// Note: this is not a conforming implementation.
30// Written by Gabriel Dos Reis <gdr@codesourcery.com>
31
32//
33// ISO 14882:1998
34// 18.2.1
35//
36
1143680e
SE
37#ifndef _GLIBCXX_NUMERIC_LIMITS
38#define _GLIBCXX_NUMERIC_LIMITS 1
54c1bf78
BK
39
40#pragma GCC system_header
41
54c1bf78
BK
42#include <bits/c++config.h>
43
44//
45// The numeric_limits<> traits document implementation-defined aspects
46// of fundamental arithmetic data types (integers and floating points).
ce4674f2 47// From Standard C++ point of view, there are 14 such types:
54c1bf78 48// * integers
94a86be0 49// bool (1)
ce4674f2 50// char, signed char, unsigned char, wchar_t (4)
54c1bf78
BK
51// short, unsigned short (2)
52// int, unsigned (2)
53// long, unsigned long (2)
54//
55// * floating points
56// float (1)
57// double (1)
58// long double (1)
59//
28dac70a 60// GNU C++ understands (where supported by the host C-library)
54c1bf78
BK
61// * integer
62// long long, unsigned long long (2)
63//
ce4674f2 64// which brings us to 16 fundamental arithmetic data types in GNU C++.
54c1bf78 65//
6ad8f949 66//
54c1bf78
BK
67// Since a numeric_limits<> is a bit tricky to get right, we rely on
68// an interface composed of macros which should be defined in config/os
69// or config/cpu when they differ from the generic (read arbitrary)
70// definitions given here.
71//
72
585e661a
GDR
73// These values can be overridden in the target configuration file.
74// The default values are appropriate for many 32-bit targets.
54c1bf78 75
28dac70a 76// GCC only intrinsically supports modulo integral types. The only remaining
da28539c
RH
77// integral exceptional values is division by zero. Only targets that do not
78// signal division by zero in some "hard to ignore" way should use false.
2778669a
PE
79#ifndef __glibcxx_integral_traps
80# define __glibcxx_integral_traps true
54c1bf78
BK
81#endif
82
54c1bf78
BK
83// float
84//
85
28dac70a 86// Default values. Should be overridden in configuration files if necessary.
54c1bf78 87
2778669a
PE
88#ifndef __glibcxx_float_has_denorm_loss
89# define __glibcxx_float_has_denorm_loss false
54c1bf78 90#endif
2778669a
PE
91#ifndef __glibcxx_float_traps
92# define __glibcxx_float_traps false
54c1bf78 93#endif
2778669a
PE
94#ifndef __glibcxx_float_tinyness_before
95# define __glibcxx_float_tinyness_before false
54c1bf78
BK
96#endif
97
54c1bf78
BK
98// double
99
28dac70a 100// Default values. Should be overridden in configuration files if necessary.
54c1bf78 101
2778669a
PE
102#ifndef __glibcxx_double_has_denorm_loss
103# define __glibcxx_double_has_denorm_loss false
54c1bf78 104#endif
2778669a
PE
105#ifndef __glibcxx_double_traps
106# define __glibcxx_double_traps false
54c1bf78 107#endif
2778669a
PE
108#ifndef __glibcxx_double_tinyness_before
109# define __glibcxx_double_tinyness_before false
54c1bf78
BK
110#endif
111
54c1bf78
BK
112// long double
113
28dac70a 114// Default values. Should be overridden in configuration files if necessary.
54c1bf78 115
2778669a
PE
116#ifndef __glibcxx_long_double_has_denorm_loss
117# define __glibcxx_long_double_has_denorm_loss false
54c1bf78 118#endif
2778669a
PE
119#ifndef __glibcxx_long_double_traps
120# define __glibcxx_long_double_traps false
54c1bf78 121#endif
2778669a
PE
122#ifndef __glibcxx_long_double_tinyness_before
123# define __glibcxx_long_double_tinyness_before false
725dc051 124#endif
54c1bf78 125
6ad8f949
RH
126// You should not need to define any macros below this point.
127
78a7c317 128#define __glibcxx_signed_b(T,B) ((T)(-1) < 0)
6ad8f949 129
78a7c317
DD
130#define __glibcxx_min_b(T,B) \
131 (__glibcxx_signed_b (T,B) ? -__glibcxx_max_b (T,B) - 1 : (T)0)
6ad8f949 132
78a7c317
DD
133#define __glibcxx_max_b(T,B) \
134 (__glibcxx_signed_b (T,B) ? \
135 (((((T)1 << (__glibcxx_digits_b (T,B) - 1)) - 1) << 1) + 1) : ~(T)0)
6ad8f949 136
78a7c317
DD
137#define __glibcxx_digits_b(T,B) \
138 (B - __glibcxx_signed_b (T,B))
6ad8f949
RH
139
140// The fraction 643/2136 approximates log10(2) to 7 significant digits.
78a7c317
DD
141#define __glibcxx_digits10_b(T,B) \
142 (__glibcxx_digits_b (T,B) * 643L / 2136)
143
144#define __glibcxx_signed(T) \
145 __glibcxx_signed_b (T, sizeof(T) * __CHAR_BIT__)
146#define __glibcxx_min(T) \
147 __glibcxx_min_b (T, sizeof(T) * __CHAR_BIT__)
148#define __glibcxx_max(T) \
149 __glibcxx_max_b (T, sizeof(T) * __CHAR_BIT__)
150#define __glibcxx_digits(T) \
151 __glibcxx_digits_b (T, sizeof(T) * __CHAR_BIT__)
2778669a 152#define __glibcxx_digits10(T) \
78a7c317 153 __glibcxx_digits10_b (T, sizeof(T) * __CHAR_BIT__)
6ad8f949 154
018afad3 155#define __glibcxx_max_digits10(T) \
dd60dacd 156 (2 + (T) * 643L / 2136)
54c1bf78 157
12ffa228
BK
158namespace std _GLIBCXX_VISIBILITY(default)
159{
160_GLIBCXX_BEGIN_NAMESPACE_VERSION
3cbc7af0 161
bd2726e0
PE
162 /**
163 * @brief Describes the rounding style for floating-point types.
164 *
165 * This is used in the std::numeric_limits class.
166 */
6ad8f949 167 enum float_round_style
54c1bf78 168 {
f910786b
BK
169 round_indeterminate = -1, /// Intermediate.
170 round_toward_zero = 0, /// To zero.
171 round_to_nearest = 1, /// To the nearest representable value.
172 round_toward_infinity = 2, /// To infinity.
173 round_toward_neg_infinity = 3 /// To negative infinity.
54c1bf78
BK
174 };
175
bd2726e0
PE
176 /**
177 * @brief Describes the denormalization for floating-point types.
178 *
179 * These values represent the presence or absence of a variable number
180 * of exponent bits. This type is used in the std::numeric_limits class.
181 */
6ad8f949 182 enum float_denorm_style
54c1bf78 183 {
bd2726e0 184 /// Indeterminate at compile time whether denormalized values are allowed.
54c1bf78 185 denorm_indeterminate = -1,
bd2726e0 186 /// The type does not allow denormalized values.
54c1bf78 187 denorm_absent = 0,
bd2726e0 188 /// The type allows denormalized values.
54c1bf78
BK
189 denorm_present = 1
190 };
191
bd2726e0
PE
192 /**
193 * @brief Part of std::numeric_limits.
194 *
195 * The @c static @c const members are usable as integral constant
196 * expressions.
197 *
28dac70a 198 * @note This is a separate class for purposes of efficiency; you
bd2726e0
PE
199 * should only access these members as part of an instantiation
200 * of the std::numeric_limits class.
201 */
84979344
BK
202 struct __numeric_limits_base
203 {
bd2726e0 204 /** This will be true for all fundamental types (which have
94a86be0
BK
205 specializations), and false for everything else. */
206 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = false;
84979344 207
bd2726e0 208 /** The number of @c radix digits that be represented without change: for
94a86be0
BK
209 integer types, the number of non-sign bits in the mantissa; for
210 floating types, the number of @c radix digits in the mantissa. */
211 static _GLIBCXX_USE_CONSTEXPR int digits = 0;
212
bd2726e0 213 /** The number of base 10 digits that can be represented without change. */
94a86be0
BK
214 static _GLIBCXX_USE_CONSTEXPR int digits10 = 0;
215
734f5023 216#if __cplusplus >= 201103L
018afad3
ESR
217 /** The number of base 10 digits required to ensure that values which
218 differ are always differentiated. */
94a86be0 219 static constexpr int max_digits10 = 0;
018afad3 220#endif
94a86be0 221
bd2726e0 222 /** True if the type is signed. */
94a86be0
BK
223 static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
224
c0ffa2ba 225 /** True if the type is integer. */
94a86be0
BK
226 static _GLIBCXX_USE_CONSTEXPR bool is_integer = false;
227
c0ffa2ba 228 /** True if the type uses an exact representation. All integer types are
94a86be0 229 exact, but not all exact types are integer. For example, rational and
c0ffa2ba 230 fixed-exponent representations are exact but not integer. */
94a86be0
BK
231 static _GLIBCXX_USE_CONSTEXPR bool is_exact = false;
232
bd2726e0 233 /** For integer types, specifies the base of the representation. For
94a86be0
BK
234 floating types, specifies the base of the exponent representation. */
235 static _GLIBCXX_USE_CONSTEXPR int radix = 0;
84979344 236
bd2726e0 237 /** The minimum negative integer such that @c radix raised to the power of
94a86be0
BK
238 (one less than that integer) is a normalized floating point number. */
239 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
240
bd2726e0 241 /** The minimum negative integer such that 10 raised to that power is in
94a86be0
BK
242 the range of normalized floating point numbers. */
243 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
244
bd2726e0 245 /** The maximum positive integer such that @c radix raised to the power of
94a86be0 246 (one less than that integer) is a representable finite floating point
bd2726e0 247 number. */
94a86be0
BK
248 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
249
bd2726e0 250 /** The maximum positive integer such that 10 raised to that power is in
94a86be0
BK
251 the range of representable finite floating point numbers. */
252 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
6ad8f949 253
bd2726e0 254 /** True if the type has a representation for positive infinity. */
94a86be0
BK
255 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
256
bd2726e0 257 /** True if the type has a representation for a quiet (non-signaling)
c0ffa2ba 258 Not a Number. */
94a86be0
BK
259 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
260
bd2726e0 261 /** True if the type has a representation for a signaling
c0ffa2ba 262 Not a Number. */
94a86be0
BK
263 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
264
bd2726e0 265 /** See std::float_denorm_style for more information. */
94a86be0
BK
266 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm = denorm_absent;
267
c0ffa2ba
BK
268 /** True if loss of accuracy is detected as a denormalization loss,
269 rather than as an inexact result. */
94a86be0 270 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
84979344 271
bd2726e0 272 /** True if-and-only-if the type adheres to the IEC 559 standard, also
94a86be0
BK
273 known as IEEE 754. (Only makes sense for floating point types.) */
274 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
275
c0ffa2ba 276 /** True if the set of values representable by the type is
94a86be0 277 finite. All built-in types are bounded, this member would be
c0ffa2ba 278 false for arbitrary precision types. */
94a86be0
BK
279 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = false;
280
1c830087
MG
281 /** True if the type is @e modulo. A type is modulo if, for any
282 operation involving +, -, or * on values of that type whose
283 result would fall outside the range [min(),max()], the value
284 returned differs from the true value by an integer multiple of
285 max() - min() + 1. On most machines, this is false for floating
286 types, true for unsigned integers, and true for signed integers.
287 See PR22200 about signed integers. */
94a86be0 288 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
84979344 289
bd2726e0 290 /** True if trapping is implemented for this type. */
94a86be0
BK
291 static _GLIBCXX_USE_CONSTEXPR bool traps = false;
292
28dac70a 293 /** True if tininess is detected before rounding. (see IEC 559) */
94a86be0
BK
294 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
295
bd2726e0 296 /** See std::float_round_style for more information. This is only
94a86be0 297 meaningful for floating types; integer types will all be
bd2726e0 298 round_toward_zero. */
33ac58d5 299 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style =
94a86be0 300 round_toward_zero;
84979344
BK
301 };
302
bd2726e0
PE
303 /**
304 * @brief Properties of fundamental types.
305 *
306 * This class allows a program to obtain information about the
307 * representation of a fundamental type on a given platform. For
308 * non-fundamental types, the functions will return 0 and the data
309 * members will all be @c false.
bd2726e0 310 */
6ad8f949
RH
311 template<typename _Tp>
312 struct numeric_limits : public __numeric_limits_base
54c1bf78 313 {
bd2726e0 314 /** The minimum finite value, or for floating types with
94a86be0
BK
315 denormalization, the minimum positive normalized value. */
316 static _GLIBCXX_CONSTEXPR _Tp
b98fcf6e 317 min() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
94a86be0 318
bd2726e0 319 /** The maximum finite value. */
94a86be0 320 static _GLIBCXX_CONSTEXPR _Tp
b98fcf6e 321 max() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
94a86be0 322
734f5023 323#if __cplusplus >= 201103L
018afad3
ESR
324 /** A finite value x such that there is no other finite value y
325 * where y < x. */
94a86be0 326 static constexpr _Tp
b98fcf6e 327 lowest() noexcept { return _Tp(); }
018afad3 328#endif
94a86be0 329
bd2726e0 330 /** The @e machine @e epsilon: the difference between 1 and the least
94a86be0
BK
331 value greater than 1 that is representable. */
332 static _GLIBCXX_CONSTEXPR _Tp
b98fcf6e 333 epsilon() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
94a86be0 334
bd2726e0 335 /** The maximum rounding error measurement (see LIA-1). */
94a86be0 336 static _GLIBCXX_CONSTEXPR _Tp
b98fcf6e 337 round_error() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
94a86be0 338
bd2726e0 339 /** The representation of positive infinity, if @c has_infinity. */
94a86be0 340 static _GLIBCXX_CONSTEXPR _Tp
b98fcf6e 341 infinity() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
2a60a9f6 342
c0ffa2ba 343 /** The representation of a quiet Not a Number,
2a60a9f6 344 if @c has_quiet_NaN. */
94a86be0 345 static _GLIBCXX_CONSTEXPR _Tp
b98fcf6e 346 quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
94a86be0 347
c0ffa2ba 348 /** The representation of a signaling Not a Number, if
94a86be0
BK
349 @c has_signaling_NaN. */
350 static _GLIBCXX_CONSTEXPR _Tp
b98fcf6e 351 signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
94a86be0 352
bd2726e0 353 /** The minimum positive denormalized value. For types where
94a86be0 354 @c has_denorm is false, this is the minimum positive normalized
bd2726e0 355 value. */
94a86be0 356 static _GLIBCXX_CONSTEXPR _Tp
b98fcf6e 357 denorm_min() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
54c1bf78
BK
358 };
359
45e20696
JW
360 // _GLIBCXX_RESOLVE_LIB_DEFECTS
361 // 559. numeric_limits<const T>
362
ce4674f2
PC
363 template<typename _Tp>
364 struct numeric_limits<const _Tp>
365 : public numeric_limits<_Tp> { };
366
367 template<typename _Tp>
368 struct numeric_limits<volatile _Tp>
369 : public numeric_limits<_Tp> { };
370
371 template<typename _Tp>
372 struct numeric_limits<const volatile _Tp>
373 : public numeric_limits<_Tp> { };
ce4674f2
PC
374
375 // Now there follow 16 explicit specializations. Yes, 16. Make sure
45e20696
JW
376 // you get the count right. (18 in C++11 mode, with char16_t and char32_t.)
377
378 // _GLIBCXX_RESOLVE_LIB_DEFECTS
379 // 184. numeric_limits<bool> wording problems
0aa06b18
BK
380
381 /// numeric_limits<bool> specialization.
54c1bf78
BK
382 template<>
383 struct numeric_limits<bool>
384 {
94a86be0
BK
385 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
386
33ac58d5 387 static _GLIBCXX_CONSTEXPR bool
4d4cf144 388 min() _GLIBCXX_USE_NOEXCEPT { return false; }
94a86be0 389
33ac58d5 390 static _GLIBCXX_CONSTEXPR bool
4d4cf144 391 max() _GLIBCXX_USE_NOEXCEPT { return true; }
54c1bf78 392
734f5023 393#if __cplusplus >= 201103L
94a86be0 394 static constexpr bool
4d4cf144 395 lowest() noexcept { return min(); }
018afad3 396#endif
94a86be0
BK
397 static _GLIBCXX_USE_CONSTEXPR int digits = 1;
398 static _GLIBCXX_USE_CONSTEXPR int digits10 = 0;
734f5023 399#if __cplusplus >= 201103L
94a86be0 400 static constexpr int max_digits10 = 0;
018afad3 401#endif
94a86be0
BK
402 static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
403 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
404 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
405 static _GLIBCXX_USE_CONSTEXPR int radix = 2;
406
33ac58d5 407 static _GLIBCXX_CONSTEXPR bool
4d4cf144 408 epsilon() _GLIBCXX_USE_NOEXCEPT { return false; }
94a86be0 409
33ac58d5 410 static _GLIBCXX_CONSTEXPR bool
4d4cf144 411 round_error() _GLIBCXX_USE_NOEXCEPT { return false; }
94a86be0
BK
412
413 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
414 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
415 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
416 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
417
418 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
419 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
420 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
33ac58d5 421 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
94a86be0
BK
422 = denorm_absent;
423 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
424
33ac58d5 425 static _GLIBCXX_CONSTEXPR bool
4d4cf144 426 infinity() _GLIBCXX_USE_NOEXCEPT { return false; }
94a86be0 427
33ac58d5 428 static _GLIBCXX_CONSTEXPR bool
4d4cf144 429 quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return false; }
94a86be0 430
33ac58d5 431 static _GLIBCXX_CONSTEXPR bool
4d4cf144 432 signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return false; }
94a86be0 433
33ac58d5 434 static _GLIBCXX_CONSTEXPR bool
4d4cf144 435 denorm_min() _GLIBCXX_USE_NOEXCEPT { return false; }
94a86be0
BK
436
437 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
438 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
439 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
54c1bf78
BK
440
441 // It is not clear what it means for a boolean type to trap.
442 // This is a DR on the LWG issue list. Here, I use integer
443 // promotion semantics.
94a86be0
BK
444 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
445 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
33ac58d5 446 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 447 = round_toward_zero;
54c1bf78
BK
448 };
449
0aa06b18 450 /// numeric_limits<char> specialization.
54c1bf78
BK
451 template<>
452 struct numeric_limits<char>
453 {
94a86be0
BK
454 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
455
33ac58d5 456 static _GLIBCXX_CONSTEXPR char
4d4cf144 457 min() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_min(char); }
94a86be0 458
33ac58d5 459 static _GLIBCXX_CONSTEXPR char
4d4cf144 460 max() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_max(char); }
54c1bf78 461
734f5023 462#if __cplusplus >= 201103L
33ac58d5 463 static constexpr char
4d4cf144 464 lowest() noexcept { return min(); }
018afad3 465#endif
54c1bf78 466
94a86be0
BK
467 static _GLIBCXX_USE_CONSTEXPR int digits = __glibcxx_digits (char);
468 static _GLIBCXX_USE_CONSTEXPR int digits10 = __glibcxx_digits10 (char);
734f5023 469#if __cplusplus >= 201103L
94a86be0 470 static constexpr int max_digits10 = 0;
018afad3 471#endif
94a86be0
BK
472 static _GLIBCXX_USE_CONSTEXPR bool is_signed = __glibcxx_signed (char);
473 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
474 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
475 static _GLIBCXX_USE_CONSTEXPR int radix = 2;
476
33ac58d5 477 static _GLIBCXX_CONSTEXPR char
4d4cf144 478 epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 479
33ac58d5 480 static _GLIBCXX_CONSTEXPR char
4d4cf144 481 round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0
BK
482
483 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
484 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
485 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
486 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
487
488 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
489 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
490 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
33ac58d5 491 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
94a86be0
BK
492 = denorm_absent;
493 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
494
33ac58d5 495 static _GLIBCXX_CONSTEXPR
4d4cf144 496 char infinity() _GLIBCXX_USE_NOEXCEPT { return char(); }
94a86be0 497
33ac58d5 498 static _GLIBCXX_CONSTEXPR char
4d4cf144 499 quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return char(); }
94a86be0 500
33ac58d5 501 static _GLIBCXX_CONSTEXPR char
4d4cf144 502 signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return char(); }
94a86be0 503
33ac58d5 504 static _GLIBCXX_CONSTEXPR char
4d4cf144 505 denorm_min() _GLIBCXX_USE_NOEXCEPT { return static_cast<char>(0); }
94a86be0
BK
506
507 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
508 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
1c830087 509 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = !is_signed;
94a86be0
BK
510
511 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
512 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
33ac58d5 513 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 514 = round_toward_zero;
54c1bf78
BK
515 };
516
0aa06b18 517 /// numeric_limits<signed char> specialization.
54c1bf78
BK
518 template<>
519 struct numeric_limits<signed char>
520 {
94a86be0
BK
521 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
522
33ac58d5 523 static _GLIBCXX_CONSTEXPR signed char
4d4cf144 524 min() _GLIBCXX_USE_NOEXCEPT { return -__SCHAR_MAX__ - 1; }
94a86be0 525
33ac58d5 526 static _GLIBCXX_CONSTEXPR signed char
4d4cf144 527 max() _GLIBCXX_USE_NOEXCEPT { return __SCHAR_MAX__; }
54c1bf78 528
734f5023 529#if __cplusplus >= 201103L
33ac58d5 530 static constexpr signed char
4d4cf144 531 lowest() noexcept { return min(); }
018afad3 532#endif
54c1bf78 533
94a86be0 534 static _GLIBCXX_USE_CONSTEXPR int digits = __glibcxx_digits (signed char);
33ac58d5 535 static _GLIBCXX_USE_CONSTEXPR int digits10
94a86be0 536 = __glibcxx_digits10 (signed char);
734f5023 537#if __cplusplus >= 201103L
94a86be0 538 static constexpr int max_digits10 = 0;
018afad3 539#endif
94a86be0
BK
540 static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
541 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
542 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
543 static _GLIBCXX_USE_CONSTEXPR int radix = 2;
544
33ac58d5 545 static _GLIBCXX_CONSTEXPR signed char
4d4cf144 546 epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 547
33ac58d5 548 static _GLIBCXX_CONSTEXPR signed char
4d4cf144 549 round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0
BK
550
551 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
552 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
553 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
554 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
555
556 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
557 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
558 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
33ac58d5 559 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
94a86be0
BK
560 = denorm_absent;
561 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
562
33ac58d5 563 static _GLIBCXX_CONSTEXPR signed char
4d4cf144 564 infinity() _GLIBCXX_USE_NOEXCEPT { return static_cast<signed char>(0); }
94a86be0 565
33ac58d5 566 static _GLIBCXX_CONSTEXPR signed char
4d4cf144 567 quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return static_cast<signed char>(0); }
94a86be0 568
33ac58d5 569 static _GLIBCXX_CONSTEXPR signed char
4d4cf144
PC
570 signaling_NaN() _GLIBCXX_USE_NOEXCEPT
571 { return static_cast<signed char>(0); }
94a86be0 572
33ac58d5 573 static _GLIBCXX_CONSTEXPR signed char
4d4cf144
PC
574 denorm_min() _GLIBCXX_USE_NOEXCEPT
575 { return static_cast<signed char>(0); }
94a86be0
BK
576
577 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
578 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
1c830087 579 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
94a86be0
BK
580
581 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
582 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
33ac58d5 583 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 584 = round_toward_zero;
54c1bf78
BK
585 };
586
0aa06b18 587 /// numeric_limits<unsigned char> specialization.
54c1bf78
BK
588 template<>
589 struct numeric_limits<unsigned char>
590 {
94a86be0
BK
591 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
592
33ac58d5 593 static _GLIBCXX_CONSTEXPR unsigned char
4d4cf144 594 min() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 595
33ac58d5 596 static _GLIBCXX_CONSTEXPR unsigned char
4d4cf144 597 max() _GLIBCXX_USE_NOEXCEPT { return __SCHAR_MAX__ * 2U + 1; }
54c1bf78 598
734f5023 599#if __cplusplus >= 201103L
33ac58d5 600 static constexpr unsigned char
4d4cf144 601 lowest() noexcept { return min(); }
018afad3 602#endif
54c1bf78 603
33ac58d5 604 static _GLIBCXX_USE_CONSTEXPR int digits
94a86be0 605 = __glibcxx_digits (unsigned char);
33ac58d5 606 static _GLIBCXX_USE_CONSTEXPR int digits10
94a86be0 607 = __glibcxx_digits10 (unsigned char);
734f5023 608#if __cplusplus >= 201103L
94a86be0 609 static constexpr int max_digits10 = 0;
018afad3 610#endif
94a86be0
BK
611 static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
612 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
613 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
614 static _GLIBCXX_USE_CONSTEXPR int radix = 2;
615
33ac58d5 616 static _GLIBCXX_CONSTEXPR unsigned char
4d4cf144 617 epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 618
33ac58d5 619 static _GLIBCXX_CONSTEXPR unsigned char
4d4cf144 620 round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0
BK
621
622 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
623 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
624 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
625 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
626
627 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
628 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
629 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
33ac58d5 630 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
94a86be0
BK
631 = denorm_absent;
632 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
633
33ac58d5 634 static _GLIBCXX_CONSTEXPR unsigned char
4d4cf144
PC
635 infinity() _GLIBCXX_USE_NOEXCEPT
636 { return static_cast<unsigned char>(0); }
94a86be0 637
33ac58d5 638 static _GLIBCXX_CONSTEXPR unsigned char
4d4cf144
PC
639 quiet_NaN() _GLIBCXX_USE_NOEXCEPT
640 { return static_cast<unsigned char>(0); }
94a86be0 641
33ac58d5 642 static _GLIBCXX_CONSTEXPR unsigned char
4d4cf144
PC
643 signaling_NaN() _GLIBCXX_USE_NOEXCEPT
644 { return static_cast<unsigned char>(0); }
94a86be0 645
33ac58d5 646 static _GLIBCXX_CONSTEXPR unsigned char
4d4cf144
PC
647 denorm_min() _GLIBCXX_USE_NOEXCEPT
648 { return static_cast<unsigned char>(0); }
94a86be0
BK
649
650 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
651 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
652 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
653
654 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
655 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
33ac58d5 656 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 657 = round_toward_zero;
54c1bf78
BK
658 };
659
0aa06b18 660 /// numeric_limits<wchar_t> specialization.
54c1bf78
BK
661 template<>
662 struct numeric_limits<wchar_t>
663 {
94a86be0
BK
664 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
665
33ac58d5 666 static _GLIBCXX_CONSTEXPR wchar_t
4d4cf144 667 min() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_min (wchar_t); }
94a86be0 668
33ac58d5 669 static _GLIBCXX_CONSTEXPR wchar_t
4d4cf144 670 max() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_max (wchar_t); }
54c1bf78 671
734f5023 672#if __cplusplus >= 201103L
4d4cf144
PC
673 static constexpr wchar_t
674 lowest() noexcept { return min(); }
018afad3 675#endif
54c1bf78 676
94a86be0 677 static _GLIBCXX_USE_CONSTEXPR int digits = __glibcxx_digits (wchar_t);
33ac58d5 678 static _GLIBCXX_USE_CONSTEXPR int digits10
94a86be0 679 = __glibcxx_digits10 (wchar_t);
734f5023 680#if __cplusplus >= 201103L
94a86be0 681 static constexpr int max_digits10 = 0;
018afad3 682#endif
94a86be0
BK
683 static _GLIBCXX_USE_CONSTEXPR bool is_signed = __glibcxx_signed (wchar_t);
684 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
685 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
686 static _GLIBCXX_USE_CONSTEXPR int radix = 2;
687
33ac58d5 688 static _GLIBCXX_CONSTEXPR wchar_t
4d4cf144 689 epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 690
33ac58d5 691 static _GLIBCXX_CONSTEXPR wchar_t
4d4cf144 692 round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0
BK
693
694 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
695 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
696 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
697 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
698
699 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
700 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
701 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
33ac58d5 702 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
94a86be0
BK
703 = denorm_absent;
704 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
705
33ac58d5 706 static _GLIBCXX_CONSTEXPR wchar_t
4d4cf144 707 infinity() _GLIBCXX_USE_NOEXCEPT { return wchar_t(); }
94a86be0 708
33ac58d5 709 static _GLIBCXX_CONSTEXPR wchar_t
4d4cf144 710 quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return wchar_t(); }
94a86be0 711
33ac58d5 712 static _GLIBCXX_CONSTEXPR wchar_t
4d4cf144 713 signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return wchar_t(); }
94a86be0 714
33ac58d5 715 static _GLIBCXX_CONSTEXPR wchar_t
4d4cf144 716 denorm_min() _GLIBCXX_USE_NOEXCEPT { return wchar_t(); }
94a86be0
BK
717
718 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
719 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
1c830087 720 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = !is_signed;
94a86be0
BK
721
722 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
723 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
33ac58d5 724 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 725 = round_toward_zero;
54c1bf78
BK
726 };
727
734f5023 728#if __cplusplus >= 201103L
5fb0445d
PC
729 /// numeric_limits<char16_t> specialization.
730 template<>
731 struct numeric_limits<char16_t>
732 {
4d4cf144 733 static constexpr bool is_specialized = true;
94a86be0 734
33ac58d5 735 static constexpr char16_t
4d4cf144 736 min() noexcept { return __glibcxx_min (char16_t); }
94a86be0 737
33ac58d5 738 static constexpr char16_t
4d4cf144 739 max() noexcept { return __glibcxx_max (char16_t); }
5fb0445d 740
33ac58d5 741 static constexpr char16_t
4d4cf144 742 lowest() noexcept { return min(); }
5fb0445d 743
4d4cf144
PC
744 static constexpr int digits = __glibcxx_digits (char16_t);
745 static constexpr int digits10 = __glibcxx_digits10 (char16_t);
94a86be0 746 static constexpr int max_digits10 = 0;
4d4cf144
PC
747 static constexpr bool is_signed = __glibcxx_signed (char16_t);
748 static constexpr bool is_integer = true;
749 static constexpr bool is_exact = true;
750 static constexpr int radix = 2;
94a86be0 751
33ac58d5 752 static constexpr char16_t
4d4cf144 753 epsilon() noexcept { return 0; }
94a86be0 754
33ac58d5 755 static constexpr char16_t
4d4cf144 756 round_error() noexcept { return 0; }
94a86be0 757
4d4cf144
PC
758 static constexpr int min_exponent = 0;
759 static constexpr int min_exponent10 = 0;
760 static constexpr int max_exponent = 0;
761 static constexpr int max_exponent10 = 0;
94a86be0 762
4d4cf144
PC
763 static constexpr bool has_infinity = false;
764 static constexpr bool has_quiet_NaN = false;
765 static constexpr bool has_signaling_NaN = false;
766 static constexpr float_denorm_style has_denorm = denorm_absent;
767 static constexpr bool has_denorm_loss = false;
94a86be0 768
33ac58d5 769 static constexpr char16_t
4d4cf144 770 infinity() noexcept { return char16_t(); }
94a86be0 771
33ac58d5 772 static constexpr char16_t
4d4cf144 773 quiet_NaN() noexcept { return char16_t(); }
94a86be0 774
33ac58d5 775 static constexpr char16_t
4d4cf144 776 signaling_NaN() noexcept { return char16_t(); }
94a86be0 777
33ac58d5 778 static constexpr char16_t
4d4cf144 779 denorm_min() noexcept { return char16_t(); }
94a86be0 780
4d4cf144
PC
781 static constexpr bool is_iec559 = false;
782 static constexpr bool is_bounded = true;
1c830087 783 static constexpr bool is_modulo = !is_signed;
94a86be0 784
4d4cf144
PC
785 static constexpr bool traps = __glibcxx_integral_traps;
786 static constexpr bool tinyness_before = false;
787 static constexpr float_round_style round_style = round_toward_zero;
5fb0445d
PC
788 };
789
790 /// numeric_limits<char32_t> specialization.
791 template<>
792 struct numeric_limits<char32_t>
793 {
4d4cf144 794 static constexpr bool is_specialized = true;
94a86be0 795
33ac58d5 796 static constexpr char32_t
4d4cf144 797 min() noexcept { return __glibcxx_min (char32_t); }
94a86be0 798
33ac58d5 799 static constexpr char32_t
4d4cf144 800 max() noexcept { return __glibcxx_max (char32_t); }
5fb0445d 801
33ac58d5 802 static constexpr char32_t
4d4cf144 803 lowest() noexcept { return min(); }
5fb0445d 804
4d4cf144
PC
805 static constexpr int digits = __glibcxx_digits (char32_t);
806 static constexpr int digits10 = __glibcxx_digits10 (char32_t);
94a86be0 807 static constexpr int max_digits10 = 0;
4d4cf144
PC
808 static constexpr bool is_signed = __glibcxx_signed (char32_t);
809 static constexpr bool is_integer = true;
810 static constexpr bool is_exact = true;
811 static constexpr int radix = 2;
94a86be0 812
33ac58d5 813 static constexpr char32_t
4d4cf144 814 epsilon() noexcept { return 0; }
94a86be0 815
33ac58d5 816 static constexpr char32_t
4d4cf144 817 round_error() noexcept { return 0; }
94a86be0 818
4d4cf144
PC
819 static constexpr int min_exponent = 0;
820 static constexpr int min_exponent10 = 0;
821 static constexpr int max_exponent = 0;
822 static constexpr int max_exponent10 = 0;
94a86be0 823
4d4cf144
PC
824 static constexpr bool has_infinity = false;
825 static constexpr bool has_quiet_NaN = false;
826 static constexpr bool has_signaling_NaN = false;
827 static constexpr float_denorm_style has_denorm = denorm_absent;
828 static constexpr bool has_denorm_loss = false;
94a86be0 829
33ac58d5 830 static constexpr char32_t
4d4cf144 831 infinity() noexcept { return char32_t(); }
94a86be0 832
33ac58d5 833 static constexpr char32_t
4d4cf144 834 quiet_NaN() noexcept { return char32_t(); }
94a86be0 835
33ac58d5 836 static constexpr char32_t
4d4cf144 837 signaling_NaN() noexcept { return char32_t(); }
94a86be0 838
33ac58d5 839 static constexpr char32_t
4d4cf144 840 denorm_min() noexcept { return char32_t(); }
94a86be0 841
4d4cf144
PC
842 static constexpr bool is_iec559 = false;
843 static constexpr bool is_bounded = true;
1c830087 844 static constexpr bool is_modulo = !is_signed;
94a86be0 845
4d4cf144
PC
846 static constexpr bool traps = __glibcxx_integral_traps;
847 static constexpr bool tinyness_before = false;
848 static constexpr float_round_style round_style = round_toward_zero;
5fb0445d
PC
849 };
850#endif
851
0aa06b18 852 /// numeric_limits<short> specialization.
54c1bf78
BK
853 template<>
854 struct numeric_limits<short>
855 {
94a86be0
BK
856 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
857
33ac58d5 858 static _GLIBCXX_CONSTEXPR short
4d4cf144 859 min() _GLIBCXX_USE_NOEXCEPT { return -__SHRT_MAX__ - 1; }
94a86be0 860
33ac58d5 861 static _GLIBCXX_CONSTEXPR short
4d4cf144 862 max() _GLIBCXX_USE_NOEXCEPT { return __SHRT_MAX__; }
54c1bf78 863
734f5023 864#if __cplusplus >= 201103L
33ac58d5 865 static constexpr short
4d4cf144 866 lowest() noexcept { return min(); }
018afad3 867#endif
54c1bf78 868
94a86be0
BK
869 static _GLIBCXX_USE_CONSTEXPR int digits = __glibcxx_digits (short);
870 static _GLIBCXX_USE_CONSTEXPR int digits10 = __glibcxx_digits10 (short);
734f5023 871#if __cplusplus >= 201103L
94a86be0 872 static constexpr int max_digits10 = 0;
018afad3 873#endif
94a86be0
BK
874 static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
875 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
876 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
877 static _GLIBCXX_USE_CONSTEXPR int radix = 2;
878
33ac58d5 879 static _GLIBCXX_CONSTEXPR short
4d4cf144 880 epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 881
33ac58d5 882 static _GLIBCXX_CONSTEXPR short
4d4cf144 883 round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0
BK
884
885 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
886 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
887 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
888 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
889
890 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
891 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
892 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
33ac58d5 893 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
94a86be0
BK
894 = denorm_absent;
895 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
896
33ac58d5 897 static _GLIBCXX_CONSTEXPR short
4d4cf144 898 infinity() _GLIBCXX_USE_NOEXCEPT { return short(); }
94a86be0 899
33ac58d5 900 static _GLIBCXX_CONSTEXPR short
4d4cf144 901 quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return short(); }
94a86be0 902
33ac58d5 903 static _GLIBCXX_CONSTEXPR short
4d4cf144 904 signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return short(); }
94a86be0 905
33ac58d5 906 static _GLIBCXX_CONSTEXPR short
4d4cf144 907 denorm_min() _GLIBCXX_USE_NOEXCEPT { return short(); }
94a86be0
BK
908
909 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
910 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
1c830087 911 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
94a86be0
BK
912
913 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
914 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
33ac58d5 915 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 916 = round_toward_zero;
54c1bf78
BK
917 };
918
0aa06b18 919 /// numeric_limits<unsigned short> specialization.
54c1bf78
BK
920 template<>
921 struct numeric_limits<unsigned short>
922 {
94a86be0
BK
923 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
924
33ac58d5 925 static _GLIBCXX_CONSTEXPR unsigned short
4d4cf144 926 min() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 927
33ac58d5 928 static _GLIBCXX_CONSTEXPR unsigned short
4d4cf144 929 max() _GLIBCXX_USE_NOEXCEPT { return __SHRT_MAX__ * 2U + 1; }
54c1bf78 930
734f5023 931#if __cplusplus >= 201103L
33ac58d5 932 static constexpr unsigned short
4d4cf144 933 lowest() noexcept { return min(); }
018afad3 934#endif
54c1bf78 935
33ac58d5 936 static _GLIBCXX_USE_CONSTEXPR int digits
94a86be0 937 = __glibcxx_digits (unsigned short);
33ac58d5 938 static _GLIBCXX_USE_CONSTEXPR int digits10
94a86be0 939 = __glibcxx_digits10 (unsigned short);
734f5023 940#if __cplusplus >= 201103L
94a86be0 941 static constexpr int max_digits10 = 0;
018afad3 942#endif
94a86be0
BK
943 static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
944 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
945 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
946 static _GLIBCXX_USE_CONSTEXPR int radix = 2;
947
33ac58d5 948 static _GLIBCXX_CONSTEXPR unsigned short
4d4cf144 949 epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 950
33ac58d5 951 static _GLIBCXX_CONSTEXPR unsigned short
4d4cf144 952 round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0
BK
953
954 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
955 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
956 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
957 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
958
959 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
960 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
961 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
33ac58d5 962 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
94a86be0
BK
963 = denorm_absent;
964 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
965
33ac58d5 966 static _GLIBCXX_CONSTEXPR unsigned short
4d4cf144
PC
967 infinity() _GLIBCXX_USE_NOEXCEPT
968 { return static_cast<unsigned short>(0); }
94a86be0 969
33ac58d5 970 static _GLIBCXX_CONSTEXPR unsigned short
4d4cf144
PC
971 quiet_NaN() _GLIBCXX_USE_NOEXCEPT
972 { return static_cast<unsigned short>(0); }
94a86be0 973
33ac58d5 974 static _GLIBCXX_CONSTEXPR unsigned short
4d4cf144
PC
975 signaling_NaN() _GLIBCXX_USE_NOEXCEPT
976 { return static_cast<unsigned short>(0); }
94a86be0 977
33ac58d5 978 static _GLIBCXX_CONSTEXPR unsigned short
4d4cf144
PC
979 denorm_min() _GLIBCXX_USE_NOEXCEPT
980 { return static_cast<unsigned short>(0); }
94a86be0
BK
981
982 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
983 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
984 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
985
986 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
987 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
33ac58d5 988 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 989 = round_toward_zero;
54c1bf78
BK
990 };
991
0aa06b18 992 /// numeric_limits<int> specialization.
54c1bf78
BK
993 template<>
994 struct numeric_limits<int>
995 {
94a86be0
BK
996 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
997
33ac58d5 998 static _GLIBCXX_CONSTEXPR int
4d4cf144 999 min() _GLIBCXX_USE_NOEXCEPT { return -__INT_MAX__ - 1; }
94a86be0 1000
33ac58d5 1001 static _GLIBCXX_CONSTEXPR int
4d4cf144 1002 max() _GLIBCXX_USE_NOEXCEPT { return __INT_MAX__; }
54c1bf78 1003
734f5023 1004#if __cplusplus >= 201103L
33ac58d5 1005 static constexpr int
4d4cf144 1006 lowest() noexcept { return min(); }
018afad3 1007#endif
54c1bf78 1008
94a86be0
BK
1009 static _GLIBCXX_USE_CONSTEXPR int digits = __glibcxx_digits (int);
1010 static _GLIBCXX_USE_CONSTEXPR int digits10 = __glibcxx_digits10 (int);
734f5023 1011#if __cplusplus >= 201103L
94a86be0 1012 static constexpr int max_digits10 = 0;
018afad3 1013#endif
94a86be0
BK
1014 static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
1015 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
1016 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
1017 static _GLIBCXX_USE_CONSTEXPR int radix = 2;
1018
33ac58d5 1019 static _GLIBCXX_CONSTEXPR int
4d4cf144 1020 epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 1021
33ac58d5 1022 static _GLIBCXX_CONSTEXPR int
4d4cf144 1023 round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0
BK
1024
1025 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
1026 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
1027 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
1028 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
1029
1030 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
1031 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
1032 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
33ac58d5 1033 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
94a86be0
BK
1034 = denorm_absent;
1035 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
1036
33ac58d5 1037 static _GLIBCXX_CONSTEXPR int
4d4cf144 1038 infinity() _GLIBCXX_USE_NOEXCEPT { return static_cast<int>(0); }
94a86be0 1039
33ac58d5 1040 static _GLIBCXX_CONSTEXPR int
4d4cf144 1041 quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return static_cast<int>(0); }
94a86be0 1042
33ac58d5 1043 static _GLIBCXX_CONSTEXPR int
4d4cf144 1044 signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return static_cast<int>(0); }
94a86be0 1045
33ac58d5 1046 static _GLIBCXX_CONSTEXPR int
4d4cf144 1047 denorm_min() _GLIBCXX_USE_NOEXCEPT { return static_cast<int>(0); }
94a86be0
BK
1048
1049 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
1050 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
1c830087 1051 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
94a86be0
BK
1052
1053 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
1054 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
33ac58d5 1055 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 1056 = round_toward_zero;
54c1bf78
BK
1057 };
1058
0aa06b18 1059 /// numeric_limits<unsigned int> specialization.
54c1bf78
BK
1060 template<>
1061 struct numeric_limits<unsigned int>
1062 {
94a86be0
BK
1063 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
1064
33ac58d5 1065 static _GLIBCXX_CONSTEXPR unsigned int
4d4cf144 1066 min() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 1067
33ac58d5 1068 static _GLIBCXX_CONSTEXPR unsigned int
4d4cf144 1069 max() _GLIBCXX_USE_NOEXCEPT { return __INT_MAX__ * 2U + 1; }
54c1bf78 1070
734f5023 1071#if __cplusplus >= 201103L
33ac58d5 1072 static constexpr unsigned int
4d4cf144 1073 lowest() noexcept { return min(); }
018afad3 1074#endif
54c1bf78 1075
33ac58d5 1076 static _GLIBCXX_USE_CONSTEXPR int digits
94a86be0 1077 = __glibcxx_digits (unsigned int);
33ac58d5 1078 static _GLIBCXX_USE_CONSTEXPR int digits10
94a86be0 1079 = __glibcxx_digits10 (unsigned int);
734f5023 1080#if __cplusplus >= 201103L
94a86be0 1081 static constexpr int max_digits10 = 0;
018afad3 1082#endif
94a86be0
BK
1083 static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
1084 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
1085 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
1086 static _GLIBCXX_USE_CONSTEXPR int radix = 2;
1087
33ac58d5 1088 static _GLIBCXX_CONSTEXPR unsigned int
4d4cf144 1089 epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 1090
33ac58d5 1091 static _GLIBCXX_CONSTEXPR unsigned int
4d4cf144 1092 round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0
BK
1093
1094 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
1095 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
1096 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
1097 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
1098
1099 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
1100 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
1101 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
33ac58d5 1102 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
94a86be0
BK
1103 = denorm_absent;
1104 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
1105
33ac58d5 1106 static _GLIBCXX_CONSTEXPR unsigned int
4d4cf144 1107 infinity() _GLIBCXX_USE_NOEXCEPT { return static_cast<unsigned int>(0); }
94a86be0 1108
33ac58d5 1109 static _GLIBCXX_CONSTEXPR unsigned int
4d4cf144
PC
1110 quiet_NaN() _GLIBCXX_USE_NOEXCEPT
1111 { return static_cast<unsigned int>(0); }
94a86be0 1112
33ac58d5 1113 static _GLIBCXX_CONSTEXPR unsigned int
4d4cf144
PC
1114 signaling_NaN() _GLIBCXX_USE_NOEXCEPT
1115 { return static_cast<unsigned int>(0); }
94a86be0 1116
33ac58d5 1117 static _GLIBCXX_CONSTEXPR unsigned int
4d4cf144
PC
1118 denorm_min() _GLIBCXX_USE_NOEXCEPT
1119 { return static_cast<unsigned int>(0); }
94a86be0
BK
1120
1121 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
1122 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
1123 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
1124
1125 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
1126 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
33ac58d5 1127 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 1128 = round_toward_zero;
54c1bf78
BK
1129 };
1130
0aa06b18 1131 /// numeric_limits<long> specialization.
54c1bf78
BK
1132 template<>
1133 struct numeric_limits<long>
1134 {
94a86be0
BK
1135 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
1136
1137 static _GLIBCXX_CONSTEXPR long
4d4cf144 1138 min() _GLIBCXX_USE_NOEXCEPT { return -__LONG_MAX__ - 1; }
94a86be0 1139
33ac58d5 1140 static _GLIBCXX_CONSTEXPR long
4d4cf144 1141 max() _GLIBCXX_USE_NOEXCEPT { return __LONG_MAX__; }
54c1bf78 1142
734f5023 1143#if __cplusplus >= 201103L
33ac58d5 1144 static constexpr long
4d4cf144 1145 lowest() noexcept { return min(); }
018afad3 1146#endif
54c1bf78 1147
94a86be0
BK
1148 static _GLIBCXX_USE_CONSTEXPR int digits = __glibcxx_digits (long);
1149 static _GLIBCXX_USE_CONSTEXPR int digits10 = __glibcxx_digits10 (long);
734f5023 1150#if __cplusplus >= 201103L
94a86be0 1151 static constexpr int max_digits10 = 0;
018afad3 1152#endif
94a86be0
BK
1153 static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
1154 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
1155 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
1156 static _GLIBCXX_USE_CONSTEXPR int radix = 2;
1157
33ac58d5 1158 static _GLIBCXX_CONSTEXPR long
4d4cf144 1159 epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 1160
33ac58d5 1161 static _GLIBCXX_CONSTEXPR long
4d4cf144 1162 round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0
BK
1163
1164 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
1165 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
1166 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
1167 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
1168
1169 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
1170 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
1171 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
33ac58d5 1172 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
94a86be0
BK
1173 = denorm_absent;
1174 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
1175
33ac58d5 1176 static _GLIBCXX_CONSTEXPR long
4d4cf144 1177 infinity() _GLIBCXX_USE_NOEXCEPT { return static_cast<long>(0); }
94a86be0 1178
33ac58d5 1179 static _GLIBCXX_CONSTEXPR long
4d4cf144 1180 quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return static_cast<long>(0); }
94a86be0 1181
33ac58d5 1182 static _GLIBCXX_CONSTEXPR long
4d4cf144 1183 signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return static_cast<long>(0); }
94a86be0 1184
33ac58d5 1185 static _GLIBCXX_CONSTEXPR long
4d4cf144 1186 denorm_min() _GLIBCXX_USE_NOEXCEPT { return static_cast<long>(0); }
94a86be0
BK
1187
1188 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
1189 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
1c830087 1190 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
94a86be0
BK
1191
1192 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
1193 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
33ac58d5 1194 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 1195 = round_toward_zero;
54c1bf78
BK
1196 };
1197
0aa06b18 1198 /// numeric_limits<unsigned long> specialization.
54c1bf78
BK
1199 template<>
1200 struct numeric_limits<unsigned long>
1201 {
94a86be0
BK
1202 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
1203
33ac58d5 1204 static _GLIBCXX_CONSTEXPR unsigned long
4d4cf144 1205 min() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 1206
33ac58d5 1207 static _GLIBCXX_CONSTEXPR unsigned long
4d4cf144 1208 max() _GLIBCXX_USE_NOEXCEPT { return __LONG_MAX__ * 2UL + 1; }
54c1bf78 1209
734f5023 1210#if __cplusplus >= 201103L
33ac58d5 1211 static constexpr unsigned long
4d4cf144 1212 lowest() noexcept { return min(); }
018afad3 1213#endif
54c1bf78 1214
33ac58d5 1215 static _GLIBCXX_USE_CONSTEXPR int digits
94a86be0 1216 = __glibcxx_digits (unsigned long);
33ac58d5 1217 static _GLIBCXX_USE_CONSTEXPR int digits10
94a86be0 1218 = __glibcxx_digits10 (unsigned long);
734f5023 1219#if __cplusplus >= 201103L
94a86be0 1220 static constexpr int max_digits10 = 0;
018afad3 1221#endif
94a86be0
BK
1222 static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
1223 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
1224 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
1225 static _GLIBCXX_USE_CONSTEXPR int radix = 2;
1226
33ac58d5 1227 static _GLIBCXX_CONSTEXPR unsigned long
4d4cf144 1228 epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 1229
33ac58d5 1230 static _GLIBCXX_CONSTEXPR unsigned long
4d4cf144 1231 round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0
BK
1232
1233 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
1234 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
1235 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
1236 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
1237
1238 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
1239 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
1240 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
33ac58d5 1241 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
94a86be0
BK
1242 = denorm_absent;
1243 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
1244
33ac58d5 1245 static _GLIBCXX_CONSTEXPR unsigned long
4d4cf144
PC
1246 infinity() _GLIBCXX_USE_NOEXCEPT
1247 { return static_cast<unsigned long>(0); }
94a86be0 1248
33ac58d5 1249 static _GLIBCXX_CONSTEXPR unsigned long
4d4cf144
PC
1250 quiet_NaN() _GLIBCXX_USE_NOEXCEPT
1251 { return static_cast<unsigned long>(0); }
94a86be0 1252
33ac58d5 1253 static _GLIBCXX_CONSTEXPR unsigned long
4d4cf144
PC
1254 signaling_NaN() _GLIBCXX_USE_NOEXCEPT
1255 { return static_cast<unsigned long>(0); }
94a86be0 1256
33ac58d5 1257 static _GLIBCXX_CONSTEXPR unsigned long
4d4cf144
PC
1258 denorm_min() _GLIBCXX_USE_NOEXCEPT
1259 { return static_cast<unsigned long>(0); }
94a86be0
BK
1260
1261 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
1262 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
1263 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
1264
1265 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
1266 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
33ac58d5 1267 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 1268 = round_toward_zero;
54c1bf78
BK
1269 };
1270
0aa06b18 1271 /// numeric_limits<long long> specialization.
54c1bf78
BK
1272 template<>
1273 struct numeric_limits<long long>
1274 {
94a86be0
BK
1275 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
1276
33ac58d5 1277 static _GLIBCXX_CONSTEXPR long long
4d4cf144 1278 min() _GLIBCXX_USE_NOEXCEPT { return -__LONG_LONG_MAX__ - 1; }
94a86be0 1279
33ac58d5 1280 static _GLIBCXX_CONSTEXPR long long
4d4cf144 1281 max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__; }
6ad8f949 1282
734f5023 1283#if __cplusplus >= 201103L
33ac58d5 1284 static constexpr long long
4d4cf144 1285 lowest() noexcept { return min(); }
018afad3 1286#endif
6ad8f949 1287
33ac58d5 1288 static _GLIBCXX_USE_CONSTEXPR int digits
94a86be0 1289 = __glibcxx_digits (long long);
33ac58d5 1290 static _GLIBCXX_USE_CONSTEXPR int digits10
94a86be0 1291 = __glibcxx_digits10 (long long);
734f5023 1292#if __cplusplus >= 201103L
94a86be0 1293 static constexpr int max_digits10 = 0;
018afad3 1294#endif
94a86be0
BK
1295 static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
1296 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
1297 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
1298 static _GLIBCXX_USE_CONSTEXPR int radix = 2;
1299
33ac58d5 1300 static _GLIBCXX_CONSTEXPR long long
4d4cf144 1301 epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 1302
33ac58d5 1303 static _GLIBCXX_CONSTEXPR long long
4d4cf144 1304 round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0
BK
1305
1306 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
1307 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
1308 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
1309 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
1310
1311 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
1312 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
1313 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
33ac58d5 1314 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
94a86be0
BK
1315 = denorm_absent;
1316 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
1317
33ac58d5 1318 static _GLIBCXX_CONSTEXPR long long
4d4cf144 1319 infinity() _GLIBCXX_USE_NOEXCEPT { return static_cast<long long>(0); }
94a86be0 1320
33ac58d5 1321 static _GLIBCXX_CONSTEXPR long long
4d4cf144 1322 quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return static_cast<long long>(0); }
94a86be0 1323
33ac58d5 1324 static _GLIBCXX_CONSTEXPR long long
4d4cf144
PC
1325 signaling_NaN() _GLIBCXX_USE_NOEXCEPT
1326 { return static_cast<long long>(0); }
94a86be0 1327
33ac58d5 1328 static _GLIBCXX_CONSTEXPR long long
4d4cf144 1329 denorm_min() _GLIBCXX_USE_NOEXCEPT { return static_cast<long long>(0); }
94a86be0
BK
1330
1331 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
1332 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
1c830087 1333 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
94a86be0
BK
1334
1335 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
1336 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
33ac58d5 1337 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 1338 = round_toward_zero;
54c1bf78
BK
1339 };
1340
0aa06b18 1341 /// numeric_limits<unsigned long long> specialization.
54c1bf78
BK
1342 template<>
1343 struct numeric_limits<unsigned long long>
1344 {
94a86be0
BK
1345 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
1346
33ac58d5 1347 static _GLIBCXX_CONSTEXPR unsigned long long
4d4cf144 1348 min() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 1349
33ac58d5 1350 static _GLIBCXX_CONSTEXPR unsigned long long
4d4cf144 1351 max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__ * 2ULL + 1; }
54c1bf78 1352
734f5023 1353#if __cplusplus >= 201103L
33ac58d5 1354 static constexpr unsigned long long
4d4cf144 1355 lowest() noexcept { return min(); }
018afad3 1356#endif
54c1bf78 1357
33ac58d5 1358 static _GLIBCXX_USE_CONSTEXPR int digits
94a86be0 1359 = __glibcxx_digits (unsigned long long);
33ac58d5 1360 static _GLIBCXX_USE_CONSTEXPR int digits10
94a86be0 1361 = __glibcxx_digits10 (unsigned long long);
734f5023 1362#if __cplusplus >= 201103L
94a86be0 1363 static constexpr int max_digits10 = 0;
018afad3 1364#endif
94a86be0
BK
1365 static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
1366 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
1367 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
1368 static _GLIBCXX_USE_CONSTEXPR int radix = 2;
1369
33ac58d5 1370 static _GLIBCXX_CONSTEXPR unsigned long long
4d4cf144 1371 epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0 1372
33ac58d5 1373 static _GLIBCXX_CONSTEXPR unsigned long long
4d4cf144 1374 round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
94a86be0
BK
1375
1376 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
1377 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
1378 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
1379 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
1380
1381 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
1382 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
1383 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
33ac58d5 1384 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
94a86be0
BK
1385 = denorm_absent;
1386 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
1387
33ac58d5 1388 static _GLIBCXX_CONSTEXPR unsigned long long
4d4cf144
PC
1389 infinity() _GLIBCXX_USE_NOEXCEPT
1390 { return static_cast<unsigned long long>(0); }
94a86be0 1391
33ac58d5 1392 static _GLIBCXX_CONSTEXPR unsigned long long
4d4cf144
PC
1393 quiet_NaN() _GLIBCXX_USE_NOEXCEPT
1394 { return static_cast<unsigned long long>(0); }
94a86be0 1395
33ac58d5 1396 static _GLIBCXX_CONSTEXPR unsigned long long
4d4cf144
PC
1397 signaling_NaN() _GLIBCXX_USE_NOEXCEPT
1398 { return static_cast<unsigned long long>(0); }
94a86be0 1399
33ac58d5 1400 static _GLIBCXX_CONSTEXPR unsigned long long
4d4cf144
PC
1401 denorm_min() _GLIBCXX_USE_NOEXCEPT
1402 { return static_cast<unsigned long long>(0); }
94a86be0
BK
1403
1404 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
1405 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
1406 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
1407
1408 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
1409 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
33ac58d5 1410 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 1411 = round_toward_zero;
54c1bf78
BK
1412 };
1413
78a7c317
DD
1414#if !defined(__STRICT_ANSI__)
1415
1416#define __INT_N(TYPE, BITSIZE, EXT, UEXT) \
1417 template<> \
1418 struct numeric_limits<TYPE> \
1419 { \
1420 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true; \
1421 \
1422 static _GLIBCXX_CONSTEXPR TYPE \
1423 min() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_min_b (TYPE, BITSIZE); } \
1424 \
1425 static _GLIBCXX_CONSTEXPR TYPE \
cd9b223a 1426 max() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_max_b (TYPE, BITSIZE); } \
78a7c317
DD
1427 \
1428 static _GLIBCXX_USE_CONSTEXPR int digits \
1429 = BITSIZE - 1; \
1430 static _GLIBCXX_USE_CONSTEXPR int digits10 \
1431 = (BITSIZE - 1) * 643L / 2136; \
1432 \
1433 static _GLIBCXX_USE_CONSTEXPR bool is_signed = true; \
1434 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true; \
1435 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true; \
1436 static _GLIBCXX_USE_CONSTEXPR int radix = 2; \
1437 \
1438 static _GLIBCXX_CONSTEXPR TYPE \
1439 epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; } \
1440 \
1441 static _GLIBCXX_CONSTEXPR TYPE \
1442 round_error() _GLIBCXX_USE_NOEXCEPT { return 0; } \
1443 \
1444 EXT \
1445 \
1446 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0; \
1447 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0; \
1448 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0; \
1449 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0; \
1450 \
1451 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false; \
1452 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false; \
1453 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false; \
1454 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm \
1455 = denorm_absent; \
1456 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false; \
1457 \
1458 static _GLIBCXX_CONSTEXPR TYPE \
1459 infinity() _GLIBCXX_USE_NOEXCEPT \
1460 { return static_cast<TYPE>(0); } \
1461 \
1462 static _GLIBCXX_CONSTEXPR TYPE \
1463 quiet_NaN() _GLIBCXX_USE_NOEXCEPT \
1464 { return static_cast<TYPE>(0); } \
1465 \
1466 static _GLIBCXX_CONSTEXPR TYPE \
1467 signaling_NaN() _GLIBCXX_USE_NOEXCEPT \
1468 { return static_cast<TYPE>(0); } \
1469 \
1470 static _GLIBCXX_CONSTEXPR TYPE \
1471 denorm_min() _GLIBCXX_USE_NOEXCEPT \
1472 { return static_cast<TYPE>(0); } \
1473 \
1474 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false; \
1475 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true; \
1476 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false; \
1477 \
1478 static _GLIBCXX_USE_CONSTEXPR bool traps \
1479 = __glibcxx_integral_traps; \
1480 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false; \
1481 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style \
1482 = round_toward_zero; \
1483 }; \
1484 \
1485 template<> \
1486 struct numeric_limits<unsigned TYPE> \
1487 { \
1488 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true; \
1489 \
1490 static _GLIBCXX_CONSTEXPR unsigned TYPE \
1491 min() _GLIBCXX_USE_NOEXCEPT { return 0; } \
1492 \
1493 static _GLIBCXX_CONSTEXPR unsigned TYPE \
fa9ac912
MG
1494 max() _GLIBCXX_USE_NOEXCEPT \
1495 { return __glibcxx_max_b (unsigned TYPE, BITSIZE); } \
78a7c317
DD
1496 \
1497 UEXT \
1498 \
1499 static _GLIBCXX_USE_CONSTEXPR int digits \
1500 = BITSIZE; \
1501 static _GLIBCXX_USE_CONSTEXPR int digits10 \
1502 = BITSIZE * 643L / 2136; \
1503 static _GLIBCXX_USE_CONSTEXPR bool is_signed = false; \
1504 static _GLIBCXX_USE_CONSTEXPR bool is_integer = true; \
1505 static _GLIBCXX_USE_CONSTEXPR bool is_exact = true; \
1506 static _GLIBCXX_USE_CONSTEXPR int radix = 2; \
1507 \
1508 static _GLIBCXX_CONSTEXPR unsigned TYPE \
1509 epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; } \
1510 \
1511 static _GLIBCXX_CONSTEXPR unsigned TYPE \
1512 round_error() _GLIBCXX_USE_NOEXCEPT { return 0; } \
1513 \
1514 static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0; \
1515 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0; \
1516 static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0; \
1517 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0; \
1518 \
1519 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false; \
1520 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false; \
1521 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false; \
1522 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm \
1523 = denorm_absent; \
1524 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false; \
1525 \
1526 static _GLIBCXX_CONSTEXPR unsigned TYPE \
1527 infinity() _GLIBCXX_USE_NOEXCEPT \
1528 { return static_cast<unsigned TYPE>(0); } \
1529 \
1530 static _GLIBCXX_CONSTEXPR unsigned TYPE \
1531 quiet_NaN() _GLIBCXX_USE_NOEXCEPT \
1532 { return static_cast<unsigned TYPE>(0); } \
1533 \
1534 static _GLIBCXX_CONSTEXPR unsigned TYPE \
1535 signaling_NaN() _GLIBCXX_USE_NOEXCEPT \
1536 { return static_cast<unsigned TYPE>(0); } \
1537 \
1538 static _GLIBCXX_CONSTEXPR unsigned TYPE \
1539 denorm_min() _GLIBCXX_USE_NOEXCEPT \
1540 { return static_cast<unsigned TYPE>(0); } \
1541 \
1542 static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false; \
1543 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true; \
1544 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true; \
1545 \
1546 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps; \
1547 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false; \
1548 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style \
1549 = round_toward_zero; \
1550 };
12bfa8bd 1551
734f5023 1552#if __cplusplus >= 201103L
12bfa8bd 1553
78a7c317
DD
1554#define __INT_N_201103(TYPE) \
1555 static constexpr TYPE \
1556 lowest() noexcept { return min(); } \
12bfa8bd 1557 static constexpr int max_digits10 = 0;
12bfa8bd 1558
78a7c317
DD
1559#define __INT_N_U201103(TYPE) \
1560 static constexpr unsigned TYPE \
1561 lowest() noexcept { return min(); } \
1562 static constexpr int max_digits10 = 0;
12bfa8bd 1563
78a7c317
DD
1564#else
1565#define __INT_N_201103(TYPE)
1566#define __INT_N_U201103(TYPE)
12bfa8bd
PC
1567#endif
1568
78a7c317
DD
1569#ifdef __GLIBCXX_TYPE_INT_N_0
1570 __INT_N(__GLIBCXX_TYPE_INT_N_0, __GLIBCXX_BITSIZE_INT_N_0,
1571 __INT_N_201103 (__GLIBCXX_TYPE_INT_N_0), __INT_N_U201103 (__GLIBCXX_TYPE_INT_N_0))
1572#endif
1573#ifdef __GLIBCXX_TYPE_INT_N_1
1574 __INT_N (__GLIBCXX_TYPE_INT_N_1, __GLIBCXX_BITSIZE_INT_N_1,
1575 __INT_N_201103 (__GLIBCXX_TYPE_INT_N_1), __INT_N_U201103 (__GLIBCXX_TYPE_INT_N_1))
1576#endif
1577#ifdef __GLIBCXX_TYPE_INT_N_2
1578 __INT_N (__GLIBCXX_TYPE_INT_N_2, __GLIBCXX_BITSIZE_INT_N_2,
1579 __INT_N_201103 (__GLIBCXX_TYPE_INT_N_2), __INT_N_U201103 (__GLIBCXX_TYPE_INT_N_2))
1580#endif
1581#ifdef __GLIBCXX_TYPE_INT_N_3
1582 __INT_N (__GLIBCXX_TYPE_INT_N_3, __GLIBCXX_BITSIZE_INT_N_3,
1583 __INT_N_201103 (__GLIBCXX_TYPE_INT_N_3), __INT_N_U201103 (__GLIBCXX_TYPE_INT_N_3))
12bfa8bd 1584#endif
12bfa8bd 1585
78a7c317
DD
1586#undef __INT_N
1587#undef __INT_N_201103
1588#undef __INT_N_U201103
12bfa8bd 1589
12bfa8bd
PC
1590#endif
1591
0aa06b18 1592 /// numeric_limits<float> specialization.
54c1bf78
BK
1593 template<>
1594 struct numeric_limits<float>
1595 {
94a86be0
BK
1596 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
1597
33ac58d5 1598 static _GLIBCXX_CONSTEXPR float
4d4cf144 1599 min() _GLIBCXX_USE_NOEXCEPT { return __FLT_MIN__; }
94a86be0 1600
33ac58d5 1601 static _GLIBCXX_CONSTEXPR float
4d4cf144 1602 max() _GLIBCXX_USE_NOEXCEPT { return __FLT_MAX__; }
54c1bf78 1603
734f5023 1604#if __cplusplus >= 201103L
33ac58d5 1605 static constexpr float
4d4cf144 1606 lowest() noexcept { return -__FLT_MAX__; }
018afad3 1607#endif
54c1bf78 1608
94a86be0
BK
1609 static _GLIBCXX_USE_CONSTEXPR int digits = __FLT_MANT_DIG__;
1610 static _GLIBCXX_USE_CONSTEXPR int digits10 = __FLT_DIG__;
734f5023 1611#if __cplusplus >= 201103L
94a86be0 1612 static constexpr int max_digits10
018afad3
ESR
1613 = __glibcxx_max_digits10 (__FLT_MANT_DIG__);
1614#endif
94a86be0
BK
1615 static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
1616 static _GLIBCXX_USE_CONSTEXPR bool is_integer = false;
1617 static _GLIBCXX_USE_CONSTEXPR bool is_exact = false;
1618 static _GLIBCXX_USE_CONSTEXPR int radix = __FLT_RADIX__;
1619
33ac58d5 1620 static _GLIBCXX_CONSTEXPR float
4d4cf144 1621 epsilon() _GLIBCXX_USE_NOEXCEPT { return __FLT_EPSILON__; }
94a86be0 1622
33ac58d5 1623 static _GLIBCXX_CONSTEXPR float
4d4cf144 1624 round_error() _GLIBCXX_USE_NOEXCEPT { return 0.5F; }
94a86be0
BK
1625
1626 static _GLIBCXX_USE_CONSTEXPR int min_exponent = __FLT_MIN_EXP__;
1627 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = __FLT_MIN_10_EXP__;
1628 static _GLIBCXX_USE_CONSTEXPR int max_exponent = __FLT_MAX_EXP__;
1629 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = __FLT_MAX_10_EXP__;
1630
1631 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = __FLT_HAS_INFINITY__;
1632 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = __FLT_HAS_QUIET_NAN__;
1633 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = has_quiet_NaN;
1634 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
264c41ed 1635 = bool(__FLT_HAS_DENORM__) ? denorm_present : denorm_absent;
33ac58d5 1636 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss
94a86be0
BK
1637 = __glibcxx_float_has_denorm_loss;
1638
33ac58d5 1639 static _GLIBCXX_CONSTEXPR float
4d4cf144 1640 infinity() _GLIBCXX_USE_NOEXCEPT { return __builtin_huge_valf(); }
54c1bf78 1641
33ac58d5 1642 static _GLIBCXX_CONSTEXPR float
4d4cf144 1643 quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return __builtin_nanf(""); }
94a86be0 1644
33ac58d5 1645 static _GLIBCXX_CONSTEXPR float
4d4cf144 1646 signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return __builtin_nansf(""); }
94a86be0 1647
33ac58d5 1648 static _GLIBCXX_CONSTEXPR float
4d4cf144 1649 denorm_min() _GLIBCXX_USE_NOEXCEPT { return __FLT_DENORM_MIN__; }
94a86be0
BK
1650
1651 static _GLIBCXX_USE_CONSTEXPR bool is_iec559
1652 = has_infinity && has_quiet_NaN && has_denorm == denorm_present;
1653 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
1654 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
1655
1656 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_float_traps;
33ac58d5 1657 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before
94a86be0 1658 = __glibcxx_float_tinyness_before;
33ac58d5 1659 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 1660 = round_to_nearest;
54c1bf78
BK
1661 };
1662
2778669a
PE
1663#undef __glibcxx_float_has_denorm_loss
1664#undef __glibcxx_float_traps
1665#undef __glibcxx_float_tinyness_before
54c1bf78 1666
0aa06b18 1667 /// numeric_limits<double> specialization.
54c1bf78
BK
1668 template<>
1669 struct numeric_limits<double>
1670 {
94a86be0
BK
1671 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
1672
33ac58d5 1673 static _GLIBCXX_CONSTEXPR double
4d4cf144 1674 min() _GLIBCXX_USE_NOEXCEPT { return __DBL_MIN__; }
94a86be0 1675
33ac58d5 1676 static _GLIBCXX_CONSTEXPR double
4d4cf144 1677 max() _GLIBCXX_USE_NOEXCEPT { return __DBL_MAX__; }
54c1bf78 1678
734f5023 1679#if __cplusplus >= 201103L
33ac58d5 1680 static constexpr double
4d4cf144 1681 lowest() noexcept { return -__DBL_MAX__; }
018afad3 1682#endif
54c1bf78 1683
94a86be0
BK
1684 static _GLIBCXX_USE_CONSTEXPR int digits = __DBL_MANT_DIG__;
1685 static _GLIBCXX_USE_CONSTEXPR int digits10 = __DBL_DIG__;
734f5023 1686#if __cplusplus >= 201103L
94a86be0 1687 static constexpr int max_digits10
018afad3
ESR
1688 = __glibcxx_max_digits10 (__DBL_MANT_DIG__);
1689#endif
94a86be0
BK
1690 static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
1691 static _GLIBCXX_USE_CONSTEXPR bool is_integer = false;
1692 static _GLIBCXX_USE_CONSTEXPR bool is_exact = false;
1693 static _GLIBCXX_USE_CONSTEXPR int radix = __FLT_RADIX__;
1694
33ac58d5 1695 static _GLIBCXX_CONSTEXPR double
4d4cf144 1696 epsilon() _GLIBCXX_USE_NOEXCEPT { return __DBL_EPSILON__; }
94a86be0 1697
33ac58d5 1698 static _GLIBCXX_CONSTEXPR double
4d4cf144 1699 round_error() _GLIBCXX_USE_NOEXCEPT { return 0.5; }
94a86be0
BK
1700
1701 static _GLIBCXX_USE_CONSTEXPR int min_exponent = __DBL_MIN_EXP__;
1702 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = __DBL_MIN_10_EXP__;
1703 static _GLIBCXX_USE_CONSTEXPR int max_exponent = __DBL_MAX_EXP__;
1704 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = __DBL_MAX_10_EXP__;
1705
1706 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = __DBL_HAS_INFINITY__;
1707 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = __DBL_HAS_QUIET_NAN__;
1708 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = has_quiet_NaN;
1709 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
264c41ed 1710 = bool(__DBL_HAS_DENORM__) ? denorm_present : denorm_absent;
33ac58d5 1711 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss
94a86be0
BK
1712 = __glibcxx_double_has_denorm_loss;
1713
33ac58d5 1714 static _GLIBCXX_CONSTEXPR double
4d4cf144 1715 infinity() _GLIBCXX_USE_NOEXCEPT { return __builtin_huge_val(); }
94a86be0 1716
33ac58d5 1717 static _GLIBCXX_CONSTEXPR double
4d4cf144 1718 quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return __builtin_nan(""); }
54c1bf78 1719
33ac58d5 1720 static _GLIBCXX_CONSTEXPR double
4d4cf144 1721 signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return __builtin_nans(""); }
94a86be0 1722
33ac58d5 1723 static _GLIBCXX_CONSTEXPR double
4d4cf144 1724 denorm_min() _GLIBCXX_USE_NOEXCEPT { return __DBL_DENORM_MIN__; }
94a86be0
BK
1725
1726 static _GLIBCXX_USE_CONSTEXPR bool is_iec559
1727 = has_infinity && has_quiet_NaN && has_denorm == denorm_present;
1728 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
1729 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
1730
1731 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_double_traps;
33ac58d5 1732 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before
94a86be0 1733 = __glibcxx_double_tinyness_before;
33ac58d5 1734 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style
94a86be0 1735 = round_to_nearest;
54c1bf78
BK
1736 };
1737
2778669a
PE
1738#undef __glibcxx_double_has_denorm_loss
1739#undef __glibcxx_double_traps
1740#undef __glibcxx_double_tinyness_before
6ad8f949 1741
0aa06b18 1742 /// numeric_limits<long double> specialization.
54c1bf78
BK
1743 template<>
1744 struct numeric_limits<long double>
1745 {
94a86be0
BK
1746 static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
1747
33ac58d5 1748 static _GLIBCXX_CONSTEXPR long double
4d4cf144 1749 min() _GLIBCXX_USE_NOEXCEPT { return __LDBL_MIN__; }
94a86be0 1750
33ac58d5 1751 static _GLIBCXX_CONSTEXPR long double
4d4cf144 1752 max() _GLIBCXX_USE_NOEXCEPT { return __LDBL_MAX__; }
54c1bf78 1753
734f5023 1754#if __cplusplus >= 201103L
33ac58d5 1755 static constexpr long double
4d4cf144 1756 lowest() noexcept { return -__LDBL_MAX__; }
018afad3 1757#endif
54c1bf78 1758
94a86be0
BK
1759 static _GLIBCXX_USE_CONSTEXPR int digits = __LDBL_MANT_DIG__;
1760 static _GLIBCXX_USE_CONSTEXPR int digits10 = __LDBL_DIG__;
734f5023 1761#if __cplusplus >= 201103L
94a86be0 1762 static _GLIBCXX_USE_CONSTEXPR int max_digits10
018afad3
ESR
1763 = __glibcxx_max_digits10 (__LDBL_MANT_DIG__);
1764#endif
94a86be0
BK
1765 static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
1766 static _GLIBCXX_USE_CONSTEXPR bool is_integer = false;
1767 static _GLIBCXX_USE_CONSTEXPR bool is_exact = false;
1768 static _GLIBCXX_USE_CONSTEXPR int radix = __FLT_RADIX__;
1769
33ac58d5 1770 static _GLIBCXX_CONSTEXPR long double
4d4cf144 1771 epsilon() _GLIBCXX_USE_NOEXCEPT { return __LDBL_EPSILON__; }
94a86be0 1772
33ac58d5 1773 static _GLIBCXX_CONSTEXPR long double
4d4cf144 1774 round_error() _GLIBCXX_USE_NOEXCEPT { return 0.5L; }
94a86be0
BK
1775
1776 static _GLIBCXX_USE_CONSTEXPR int min_exponent = __LDBL_MIN_EXP__;
1777 static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = __LDBL_MIN_10_EXP__;
1778 static _GLIBCXX_USE_CONSTEXPR int max_exponent = __LDBL_MAX_EXP__;
1779 static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = __LDBL_MAX_10_EXP__;
1780
1781 static _GLIBCXX_USE_CONSTEXPR bool has_infinity = __LDBL_HAS_INFINITY__;
1782 static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = __LDBL_HAS_QUIET_NAN__;
1783 static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = has_quiet_NaN;
1784 static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
264c41ed 1785 = bool(__LDBL_HAS_DENORM__) ? denorm_present : denorm_absent;
94a86be0 1786 static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss
2778669a 1787 = __glibcxx_long_double_has_denorm_loss;
54c1bf78 1788
33ac58d5 1789 static _GLIBCXX_CONSTEXPR long double
4d4cf144 1790 infinity() _GLIBCXX_USE_NOEXCEPT { return __builtin_huge_vall(); }
54c1bf78 1791
33ac58d5 1792 static _GLIBCXX_CONSTEXPR long double
4d4cf144 1793 quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return __builtin_nanl(""); }
54c1bf78 1794
33ac58d5 1795 static _GLIBCXX_CONSTEXPR long double
4d4cf144 1796 signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return __builtin_nansl(""); }
94a86be0 1797
33ac58d5 1798 static _GLIBCXX_CONSTEXPR long double
4d4cf144 1799 denorm_min() _GLIBCXX_USE_NOEXCEPT { return __LDBL_DENORM_MIN__; }
94a86be0
BK
1800
1801 static _GLIBCXX_USE_CONSTEXPR bool is_iec559
1802 = has_infinity && has_quiet_NaN && has_denorm == denorm_present;
1803 static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
1804 static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
1805
1806 static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_long_double_traps;
33ac58d5 1807 static _GLIBCXX_USE_CONSTEXPR bool tinyness_before =
94a86be0 1808 __glibcxx_long_double_tinyness_before;
33ac58d5 1809 static _GLIBCXX_USE_CONSTEXPR float_round_style round_style =
94a86be0 1810 round_to_nearest;
54c1bf78
BK
1811 };
1812
2778669a
PE
1813#undef __glibcxx_long_double_has_denorm_loss
1814#undef __glibcxx_long_double_traps
1815#undef __glibcxx_long_double_tinyness_before
be71ea9d 1816
12ffa228
BK
1817_GLIBCXX_END_NAMESPACE_VERSION
1818} // namespace
54c1bf78 1819
2778669a
PE
1820#undef __glibcxx_signed
1821#undef __glibcxx_min
1822#undef __glibcxx_max
1823#undef __glibcxx_digits
1824#undef __glibcxx_digits10
018afad3 1825#undef __glibcxx_max_digits10
6ad8f949 1826
1143680e 1827#endif // _GLIBCXX_NUMERIC_LIMITS