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

source code of include/c++/11/limits