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