1 // The template and inlines for the numeric_limits classes. -*- C++ -*- 2 3 // Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 4 // 2008, 2009 Free Software Foundation, Inc. 5 // 6 // This file is part of the GNU ISO C++ Library. This library is free 7 // software; you can redistribute it and/or modify it under the 8 // terms of the GNU General Public License as published by the 9 // Free Software Foundation; either version 3, or (at your option) 10 // any later version. 11 12 // This library is distributed in the hope that it will be useful, 13 // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 // GNU General Public License for more details. 16 17 // Under Section 7 of GPL version 3, you are granted additional 18 // permissions described in the GCC Runtime Library Exception, version 19 // 3.1, as published by the Free Software Foundation. 20 21 // You should have received a copy of the GNU General Public License and 22 // a copy of the GCC Runtime Library Exception along with this program; 23 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24 // <http://www.gnu.org/licenses/>. 25 26 /** @file limits 27 * This is a Standard C++ Library header. 28 */ 29 30 // Note: this is not a conforming implementation. 31 // Written by Gabriel Dos Reis <gdr (a] codesourcery.com> 32 33 // 34 // ISO 14882:1998 35 // 18.2.1 36 // 37 38 #ifndef _GLIBCXX_NUMERIC_LIMITS 39 #define _GLIBCXX_NUMERIC_LIMITS 1 40 41 #pragma GCC system_header 42 43 #include <bits/c++config.h> 44 45 // 46 // The numeric_limits<> traits document implementation-defined aspects 47 // of fundamental arithmetic data types (integers and floating points). 48 // From Standard C++ point of view, there are 13 such types: 49 // * integers 50 // bool (1) 51 // char, signed char, unsigned char (3) 52 // short, unsigned short (2) 53 // int, unsigned (2) 54 // long, unsigned long (2) 55 // 56 // * floating points 57 // float (1) 58 // double (1) 59 // long double (1) 60 // 61 // GNU C++ understands (where supported by the host C-library) 62 // * integer 63 // long long, unsigned long long (2) 64 // 65 // which brings us to 15 fundamental arithmetic data types in GNU C++. 66 // 67 // 68 // Since a numeric_limits<> is a bit tricky to get right, we rely on 69 // an interface composed of macros which should be defined in config/os 70 // or config/cpu when they differ from the generic (read arbitrary) 71 // definitions given here. 72 // 73 74 // These values can be overridden in the target configuration file. 75 // The default values are appropriate for many 32-bit targets. 76 77 // GCC only intrinsically supports modulo integral types. The only remaining 78 // integral exceptional values is division by zero. Only targets that do not 79 // signal division by zero in some "hard to ignore" way should use false. 80 #ifndef __glibcxx_integral_traps 81 # define __glibcxx_integral_traps true 82 #endif 83 84 // float 85 // 86 87 // Default values. Should be overridden in configuration files if necessary. 88 89 #ifndef __glibcxx_float_has_denorm_loss 90 # define __glibcxx_float_has_denorm_loss false 91 #endif 92 #ifndef __glibcxx_float_traps 93 # define __glibcxx_float_traps false 94 #endif 95 #ifndef __glibcxx_float_tinyness_before 96 # define __glibcxx_float_tinyness_before false 97 #endif 98 99 // double 100 101 // Default values. Should be overridden in configuration files if necessary. 102 103 #ifndef __glibcxx_double_has_denorm_loss 104 # define __glibcxx_double_has_denorm_loss false 105 #endif 106 #ifndef __glibcxx_double_traps 107 # define __glibcxx_double_traps false 108 #endif 109 #ifndef __glibcxx_double_tinyness_before 110 # define __glibcxx_double_tinyness_before false 111 #endif 112 113 // long double 114 115 // Default values. Should be overridden in configuration files if necessary. 116 117 #ifndef __glibcxx_long_double_has_denorm_loss 118 # define __glibcxx_long_double_has_denorm_loss false 119 #endif 120 #ifndef __glibcxx_long_double_traps 121 # define __glibcxx_long_double_traps false 122 #endif 123 #ifndef __glibcxx_long_double_tinyness_before 124 # define __glibcxx_long_double_tinyness_before false 125 #endif 126 127 // You should not need to define any macros below this point. 128 129 #define __glibcxx_signed(T) ((T)(-1) < 0) 130 131 #define __glibcxx_min(T) \ 132 (__glibcxx_signed (T) ? (T)1 << __glibcxx_digits (T) : (T)0) 133 134 #define __glibcxx_max(T) \ 135 (__glibcxx_signed (T) ? \ 136 (((((T)1 << (__glibcxx_digits (T) - 1)) - 1) << 1) + 1) : ~(T)0) 137 138 #define __glibcxx_digits(T) \ 139 (sizeof(T) * __CHAR_BIT__ - __glibcxx_signed (T)) 140 141 // The fraction 643/2136 approximates log10(2) to 7 significant digits. 142 #define __glibcxx_digits10(T) \ 143 (__glibcxx_digits (T) * 643 / 2136) 144 145 146 _GLIBCXX_BEGIN_NAMESPACE(std) 147 148 /** 149 * @brief Describes the rounding style for floating-point types. 150 * 151 * This is used in the std::numeric_limits class. 152 */ 153 enum float_round_style 154 { 155 round_indeterminate = -1, ///< Self-explanatory. 156 round_toward_zero = 0, ///< Self-explanatory. 157 round_to_nearest = 1, ///< To the nearest representable value. 158 round_toward_infinity = 2, ///< Self-explanatory. 159 round_toward_neg_infinity = 3 ///< Self-explanatory. 160 }; 161 162 /** 163 * @brief Describes the denormalization for floating-point types. 164 * 165 * These values represent the presence or absence of a variable number 166 * of exponent bits. This type is used in the std::numeric_limits class. 167 */ 168 enum float_denorm_style 169 { 170 /// Indeterminate at compile time whether denormalized values are allowed. 171 denorm_indeterminate = -1, 172 /// The type does not allow denormalized values. 173 denorm_absent = 0, 174 /// The type allows denormalized values. 175 denorm_present = 1 176 }; 177 178 /** 179 * @brief Part of std::numeric_limits. 180 * 181 * The @c static @c const members are usable as integral constant 182 * expressions. 183 * 184 * @note This is a separate class for purposes of efficiency; you 185 * should only access these members as part of an instantiation 186 * of the std::numeric_limits class. 187 */ 188 struct __numeric_limits_base 189 { 190 /** This will be true for all fundamental types (which have 191 specializations), and false for everything else. */ 192 static const bool is_specialized = false; 193 194 /** The number of @c radix digits that be represented without change: for 195 integer types, the number of non-sign bits in the mantissa; for 196 floating types, the number of @c radix digits in the mantissa. */ 197 static const int digits = 0; 198 /** The number of base 10 digits that can be represented without change. */ 199 static const int digits10 = 0; 200 /** True if the type is signed. */ 201 static const bool is_signed = false; 202 /** True if the type is integer. 203 * Is this supposed to be "if the type is integral"? 204 */ 205 static const bool is_integer = false; 206 /** True if the type uses an exact representation. "All integer types are 207 exact, but not all exact types are integer. For example, rational and 208 fixed-exponent representations are exact but not integer." 209 [18.2.1.2]/15 */ 210 static const bool is_exact = false; 211 /** For integer types, specifies the base of the representation. For 212 floating types, specifies the base of the exponent representation. */ 213 static const int radix = 0; 214 215 /** The minimum negative integer such that @c radix raised to the power of 216 (one less than that integer) is a normalized floating point number. */ 217 static const int min_exponent = 0; 218 /** The minimum negative integer such that 10 raised to that power is in 219 the range of normalized floating point numbers. */ 220 static const int min_exponent10 = 0; 221 /** The maximum positive integer such that @c radix raised to the power of 222 (one less than that integer) is a representable finite floating point 223 number. */ 224 static const int max_exponent = 0; 225 /** The maximum positive integer such that 10 raised to that power is in 226 the range of representable finite floating point numbers. */ 227 static const int max_exponent10 = 0; 228 229 /** True if the type has a representation for positive infinity. */ 230 static const bool has_infinity = false; 231 /** True if the type has a representation for a quiet (non-signaling) 232 "Not a Number." */ 233 static const bool has_quiet_NaN = false; 234 /** True if the type has a representation for a signaling 235 "Not a Number." */ 236 static const bool has_signaling_NaN = false; 237 /** See std::float_denorm_style for more information. */ 238 static const float_denorm_style has_denorm = denorm_absent; 239 /** "True if loss of accuracy is detected as a denormalization loss, 240 rather than as an inexact result." [18.2.1.2]/42 */ 241 static const bool has_denorm_loss = false; 242 243 /** True if-and-only-if the type adheres to the IEC 559 standard, also 244 known as IEEE 754. (Only makes sense for floating point types.) */ 245 static const bool is_iec559 = false; 246 /** "True if the set of values representable by the type is finite. All 247 built-in types are bounded, this member would be false for arbitrary 248 precision types." [18.2.1.2]/54 */ 249 static const bool is_bounded = false; 250 /** True if the type is @e modulo, that is, if it is possible to add two 251 positive numbers and have a result that wraps around to a third number 252 that is less. Typically false for floating types, true for unsigned 253 integers, and true for signed integers. */ 254 static const bool is_modulo = false; 255 256 /** True if trapping is implemented for this type. */ 257 static const bool traps = false; 258 /** True if tininess is detected before rounding. (see IEC 559) */ 259 static const bool tinyness_before = false; 260 /** See std::float_round_style for more information. This is only 261 meaningful for floating types; integer types will all be 262 round_toward_zero. */ 263 static const float_round_style round_style = round_toward_zero; 264 }; 265 266 /** 267 * @brief Properties of fundamental types. 268 * 269 * This class allows a program to obtain information about the 270 * representation of a fundamental type on a given platform. For 271 * non-fundamental types, the functions will return 0 and the data 272 * members will all be @c false. 273 * 274 * _GLIBCXX_RESOLVE_LIB_DEFECTS: DRs 201 and 184 (hi Gaby!) are 275 * noted, but not incorporated in this documented (yet). 276 */ 277 template<typename _Tp> 278 struct numeric_limits : public __numeric_limits_base 279 { 280 /** The minimum finite value, or for floating types with 281 denormalization, the minimum positive normalized value. */ 282 static _Tp min() throw() { return static_cast<_Tp>(0); } 283 /** The maximum finite value. */ 284 static _Tp max() throw() { return static_cast<_Tp>(0); } 285 /** The @e machine @e epsilon: the difference between 1 and the least 286 value greater than 1 that is representable. */ 287 static _Tp epsilon() throw() { return static_cast<_Tp>(0); } 288 /** The maximum rounding error measurement (see LIA-1). */ 289 static _Tp round_error() throw() { return static_cast<_Tp>(0); } 290 /** The representation of positive infinity, if @c has_infinity. */ 291 static _Tp infinity() throw() { return static_cast<_Tp>(0); } 292 /** The representation of a quiet "Not a Number," if @c has_quiet_NaN. */ 293 static _Tp quiet_NaN() throw() { return static_cast<_Tp>(0); } 294 /** The representation of a signaling "Not a Number," if 295 @c has_signaling_NaN. */ 296 static _Tp signaling_NaN() throw() { return static_cast<_Tp>(0); } 297 /** The minimum positive denormalized value. For types where 298 @c has_denorm is false, this is the minimum positive normalized 299 value. */ 300 static _Tp denorm_min() throw() { return static_cast<_Tp>(0); } 301 }; 302 303 // Now there follow 15 explicit specializations. Yes, 15. Make sure 304 // you get the count right. 305 306 /// numeric_limits<bool> specialization. 307 template<> 308 struct numeric_limits<bool> 309 { 310 static const bool is_specialized = true; 311 312 static bool min() throw() 313 { return false; } 314 static bool max() throw() 315 { return true; } 316 317 static const int digits = 1; 318 static const int digits10 = 0; 319 static const bool is_signed = false; 320 static const bool is_integer = true; 321 static const bool is_exact = true; 322 static const int radix = 2; 323 static bool epsilon() throw() 324 { return false; } 325 static bool round_error() throw() 326 { return false; } 327 328 static const int min_exponent = 0; 329 static const int min_exponent10 = 0; 330 static const int max_exponent = 0; 331 static const int max_exponent10 = 0; 332 333 static const bool has_infinity = false; 334 static const bool has_quiet_NaN = false; 335 static const bool has_signaling_NaN = false; 336 static const float_denorm_style has_denorm = denorm_absent; 337 static const bool has_denorm_loss = false; 338 339 static bool infinity() throw() 340 { return false; } 341 static bool quiet_NaN() throw() 342 { return false; } 343 static bool signaling_NaN() throw() 344 { return false; } 345 static bool denorm_min() throw() 346 { return false; } 347 348 static const bool is_iec559 = false; 349 static const bool is_bounded = true; 350 static const bool is_modulo = false; 351 352 // It is not clear what it means for a boolean type to trap. 353 // This is a DR on the LWG issue list. Here, I use integer 354 // promotion semantics. 355 static const bool traps = __glibcxx_integral_traps; 356 static const bool tinyness_before = false; 357 static const float_round_style round_style = round_toward_zero; 358 }; 359 360 /// numeric_limits<char> specialization. 361 template<> 362 struct numeric_limits<char> 363 { 364 static const bool is_specialized = true; 365 366 static char min() throw() 367 { return __glibcxx_min(char); } 368 static char max() throw() 369 { return __glibcxx_max(char); } 370 371 static const int digits = __glibcxx_digits (char); 372 static const int digits10 = __glibcxx_digits10 (char); 373 static const bool is_signed = __glibcxx_signed (char); 374 static const bool is_integer = true; 375 static const bool is_exact = true; 376 static const int radix = 2; 377 static char epsilon() throw() 378 { return 0; } 379 static char round_error() throw() 380 { return 0; } 381 382 static const int min_exponent = 0; 383 static const int min_exponent10 = 0; 384 static const int max_exponent = 0; 385 static const int max_exponent10 = 0; 386 387 static const bool has_infinity = false; 388 static const bool has_quiet_NaN = false; 389 static const bool has_signaling_NaN = false; 390 static const float_denorm_style has_denorm = denorm_absent; 391 static const bool has_denorm_loss = false; 392 393 static char infinity() throw() 394 { return char(); } 395 static char quiet_NaN() throw() 396 { return char(); } 397 static char signaling_NaN() throw() 398 { return char(); } 399 static char denorm_min() throw() 400 { return static_cast<char>(0); } 401 402 static const bool is_iec559 = false; 403 static const bool is_bounded = true; 404 static const bool is_modulo = true; 405 406 static const bool traps = __glibcxx_integral_traps; 407 static const bool tinyness_before = false; 408 static const float_round_style round_style = round_toward_zero; 409 }; 410 411 /// numeric_limits<signed char> specialization. 412 template<> 413 struct numeric_limits<signed char> 414 { 415 static const bool is_specialized = true; 416 417 static signed char min() throw() 418 { return -__SCHAR_MAX__ - 1; } 419 static signed char max() throw() 420 { return __SCHAR_MAX__; } 421 422 static const int digits = __glibcxx_digits (signed char); 423 static const int digits10 = __glibcxx_digits10 (signed char); 424 static const bool is_signed = true; 425 static const bool is_integer = true; 426 static const bool is_exact = true; 427 static const int radix = 2; 428 static signed char epsilon() throw() 429 { return 0; } 430 static signed char round_error() throw() 431 { return 0; } 432 433 static const int min_exponent = 0; 434 static const int min_exponent10 = 0; 435 static const int max_exponent = 0; 436 static const int max_exponent10 = 0; 437 438 static const bool has_infinity = false; 439 static const bool has_quiet_NaN = false; 440 static const bool has_signaling_NaN = false; 441 static const float_denorm_style has_denorm = denorm_absent; 442 static const bool has_denorm_loss = false; 443 444 static signed char infinity() throw() 445 { return static_cast<signed char>(0); } 446 static signed char quiet_NaN() throw() 447 { return static_cast<signed char>(0); } 448 static signed char signaling_NaN() throw() 449 { return static_cast<signed char>(0); } 450 static signed char denorm_min() throw() 451 { return static_cast<signed char>(0); } 452 453 static const bool is_iec559 = false; 454 static const bool is_bounded = true; 455 static const bool is_modulo = true; 456 457 static const bool traps = __glibcxx_integral_traps; 458 static const bool tinyness_before = false; 459 static const float_round_style round_style = round_toward_zero; 460 }; 461 462 /// numeric_limits<unsigned char> specialization. 463 template<> 464 struct numeric_limits<unsigned char> 465 { 466 static const bool is_specialized = true; 467 468 static unsigned char min() throw() 469 { return 0; } 470 static unsigned char max() throw() 471 { return __SCHAR_MAX__ * 2U + 1; } 472 473 static const int digits = __glibcxx_digits (unsigned char); 474 static const int digits10 = __glibcxx_digits10 (unsigned char); 475 static const bool is_signed = false; 476 static const bool is_integer = true; 477 static const bool is_exact = true; 478 static const int radix = 2; 479 static unsigned char epsilon() throw() 480 { return 0; } 481 static unsigned char round_error() throw() 482 { return 0; } 483 484 static const int min_exponent = 0; 485 static const int min_exponent10 = 0; 486 static const int max_exponent = 0; 487 static const int max_exponent10 = 0; 488 489 static const bool has_infinity = false; 490 static const bool has_quiet_NaN = false; 491 static const bool has_signaling_NaN = false; 492 static const float_denorm_style has_denorm = denorm_absent; 493 static const bool has_denorm_loss = false; 494 495 static unsigned char infinity() throw() 496 { return static_cast<unsigned char>(0); } 497 static unsigned char quiet_NaN() throw() 498 { return static_cast<unsigned char>(0); } 499 static unsigned char signaling_NaN() throw() 500 { return static_cast<unsigned char>(0); } 501 static unsigned char denorm_min() throw() 502 { return static_cast<unsigned char>(0); } 503 504 static const bool is_iec559 = false; 505 static const bool is_bounded = true; 506 static const bool is_modulo = true; 507 508 static const bool traps = __glibcxx_integral_traps; 509 static const bool tinyness_before = false; 510 static const float_round_style round_style = round_toward_zero; 511 }; 512 513 /// numeric_limits<wchar_t> specialization. 514 template<> 515 struct numeric_limits<wchar_t> 516 { 517 static const bool is_specialized = true; 518 519 static wchar_t min() throw() 520 { return __glibcxx_min (wchar_t); } 521 static wchar_t max() throw() 522 { return __glibcxx_max (wchar_t); } 523 524 static const int digits = __glibcxx_digits (wchar_t); 525 static const int digits10 = __glibcxx_digits10 (wchar_t); 526 static const bool is_signed = __glibcxx_signed (wchar_t); 527 static const bool is_integer = true; 528 static const bool is_exact = true; 529 static const int radix = 2; 530 static wchar_t epsilon() throw() 531 { return 0; } 532 static wchar_t round_error() throw() 533 { return 0; } 534 535 static const int min_exponent = 0; 536 static const int min_exponent10 = 0; 537 static const int max_exponent = 0; 538 static const int max_exponent10 = 0; 539 540 static const bool has_infinity = false; 541 static const bool has_quiet_NaN = false; 542 static const bool has_signaling_NaN = false; 543 static const float_denorm_style has_denorm = denorm_absent; 544 static const bool has_denorm_loss = false; 545 546 static wchar_t infinity() throw() 547 { return wchar_t(); } 548 static wchar_t quiet_NaN() throw() 549 { return wchar_t(); } 550 static wchar_t signaling_NaN() throw() 551 { return wchar_t(); } 552 static wchar_t denorm_min() throw() 553 { return wchar_t(); } 554 555 static const bool is_iec559 = false; 556 static const bool is_bounded = true; 557 static const bool is_modulo = true; 558 559 static const bool traps = __glibcxx_integral_traps; 560 static const bool tinyness_before = false; 561 static const float_round_style round_style = round_toward_zero; 562 }; 563 564 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 565 /// numeric_limits<char16_t> specialization. 566 template<> 567 struct numeric_limits<char16_t> 568 { 569 static const bool is_specialized = true; 570 571 static char16_t min() throw() 572 { return __glibcxx_min (char16_t); } 573 static char16_t max() throw() 574 { return __glibcxx_max (char16_t); } 575 576 static const int digits = __glibcxx_digits (char16_t); 577 static const int digits10 = __glibcxx_digits10 (char16_t); 578 static const bool is_signed = __glibcxx_signed (char16_t); 579 static const bool is_integer = true; 580 static const bool is_exact = true; 581 static const int radix = 2; 582 static char16_t epsilon() throw() 583 { return 0; } 584 static char16_t round_error() throw() 585 { return 0; } 586 587 static const int min_exponent = 0; 588 static const int min_exponent10 = 0; 589 static const int max_exponent = 0; 590 static const int max_exponent10 = 0; 591 592 static const bool has_infinity = false; 593 static const bool has_quiet_NaN = false; 594 static const bool has_signaling_NaN = false; 595 static const float_denorm_style has_denorm = denorm_absent; 596 static const bool has_denorm_loss = false; 597 598 static char16_t infinity() throw() 599 { return char16_t(); } 600 static char16_t quiet_NaN() throw() 601 { return char16_t(); } 602 static char16_t signaling_NaN() throw() 603 { return char16_t(); } 604 static char16_t denorm_min() throw() 605 { return char16_t(); } 606 607 static const bool is_iec559 = false; 608 static const bool is_bounded = true; 609 static const bool is_modulo = true; 610 611 static const bool traps = __glibcxx_integral_traps; 612 static const bool tinyness_before = false; 613 static const float_round_style round_style = round_toward_zero; 614 }; 615 616 /// numeric_limits<char32_t> specialization. 617 template<> 618 struct numeric_limits<char32_t> 619 { 620 static const bool is_specialized = true; 621 622 static char32_t min() throw() 623 { return __glibcxx_min (char32_t); } 624 static char32_t max() throw() 625 { return __glibcxx_max (char32_t); } 626 627 static const int digits = __glibcxx_digits (char32_t); 628 static const int digits10 = __glibcxx_digits10 (char32_t); 629 static const bool is_signed = __glibcxx_signed (char32_t); 630 static const bool is_integer = true; 631 static const bool is_exact = true; 632 static const int radix = 2; 633 static char32_t epsilon() throw() 634 { return 0; } 635 static char32_t round_error() throw() 636 { return 0; } 637 638 static const int min_exponent = 0; 639 static const int min_exponent10 = 0; 640 static const int max_exponent = 0; 641 static const int max_exponent10 = 0; 642 643 static const bool has_infinity = false; 644 static const bool has_quiet_NaN = false; 645 static const bool has_signaling_NaN = false; 646 static const float_denorm_style has_denorm = denorm_absent; 647 static const bool has_denorm_loss = false; 648 649 static char32_t infinity() throw() 650 { return char32_t(); } 651 static char32_t quiet_NaN() throw() 652 { return char32_t(); } 653 static char32_t signaling_NaN() throw() 654 { return char32_t(); } 655 static char32_t denorm_min() throw() 656 { return char32_t(); } 657 658 static const bool is_iec559 = false; 659 static const bool is_bounded = true; 660 static const bool is_modulo = true; 661 662 static const bool traps = __glibcxx_integral_traps; 663 static const bool tinyness_before = false; 664 static const float_round_style round_style = round_toward_zero; 665 }; 666 #endif 667 668 /// numeric_limits<short> specialization. 669 template<> 670 struct numeric_limits<short> 671 { 672 static const bool is_specialized = true; 673 674 static short min() throw() 675 { return -__SHRT_MAX__ - 1; } 676 static short max() throw() 677 { return __SHRT_MAX__; } 678 679 static const int digits = __glibcxx_digits (short); 680 static const int digits10 = __glibcxx_digits10 (short); 681 static const bool is_signed = true; 682 static const bool is_integer = true; 683 static const bool is_exact = true; 684 static const int radix = 2; 685 static short epsilon() throw() 686 { return 0; } 687 static short round_error() throw() 688 { return 0; } 689 690 static const int min_exponent = 0; 691 static const int min_exponent10 = 0; 692 static const int max_exponent = 0; 693 static const int max_exponent10 = 0; 694 695 static const bool has_infinity = false; 696 static const bool has_quiet_NaN = false; 697 static const bool has_signaling_NaN = false; 698 static const float_denorm_style has_denorm = denorm_absent; 699 static const bool has_denorm_loss = false; 700 701 static short infinity() throw() 702 { return short(); } 703 static short quiet_NaN() throw() 704 { return short(); } 705 static short signaling_NaN() throw() 706 { return short(); } 707 static short denorm_min() throw() 708 { return short(); } 709 710 static const bool is_iec559 = false; 711 static const bool is_bounded = true; 712 static const bool is_modulo = true; 713 714 static const bool traps = __glibcxx_integral_traps; 715 static const bool tinyness_before = false; 716 static const float_round_style round_style = round_toward_zero; 717 }; 718 719 /// numeric_limits<unsigned short> specialization. 720 template<> 721 struct numeric_limits<unsigned short> 722 { 723 static const bool is_specialized = true; 724 725 static unsigned short min() throw() 726 { return 0; } 727 static unsigned short max() throw() 728 { return __SHRT_MAX__ * 2U + 1; } 729 730 static const int digits = __glibcxx_digits (unsigned short); 731 static const int digits10 = __glibcxx_digits10 (unsigned short); 732 static const bool is_signed = false; 733 static const bool is_integer = true; 734 static const bool is_exact = true; 735 static const int radix = 2; 736 static unsigned short epsilon() throw() 737 { return 0; } 738 static unsigned short round_error() throw() 739 { return 0; } 740 741 static const int min_exponent = 0; 742 static const int min_exponent10 = 0; 743 static const int max_exponent = 0; 744 static const int max_exponent10 = 0; 745 746 static const bool has_infinity = false; 747 static const bool has_quiet_NaN = false; 748 static const bool has_signaling_NaN = false; 749 static const float_denorm_style has_denorm = denorm_absent; 750 static const bool has_denorm_loss = false; 751 752 static unsigned short infinity() throw() 753 { return static_cast<unsigned short>(0); } 754 static unsigned short quiet_NaN() throw() 755 { return static_cast<unsigned short>(0); } 756 static unsigned short signaling_NaN() throw() 757 { return static_cast<unsigned short>(0); } 758 static unsigned short denorm_min() throw() 759 { return static_cast<unsigned short>(0); } 760 761 static const bool is_iec559 = false; 762 static const bool is_bounded = true; 763 static const bool is_modulo = true; 764 765 static const bool traps = __glibcxx_integral_traps; 766 static const bool tinyness_before = false; 767 static const float_round_style round_style = round_toward_zero; 768 }; 769 770 /// numeric_limits<int> specialization. 771 template<> 772 struct numeric_limits<int> 773 { 774 static const bool is_specialized = true; 775 776 static int min() throw() 777 { return -__INT_MAX__ - 1; } 778 static int max() throw() 779 { return __INT_MAX__; } 780 781 static const int digits = __glibcxx_digits (int); 782 static const int digits10 = __glibcxx_digits10 (int); 783 static const bool is_signed = true; 784 static const bool is_integer = true; 785 static const bool is_exact = true; 786 static const int radix = 2; 787 static int epsilon() throw() 788 { return 0; } 789 static int round_error() throw() 790 { return 0; } 791 792 static const int min_exponent = 0; 793 static const int min_exponent10 = 0; 794 static const int max_exponent = 0; 795 static const int max_exponent10 = 0; 796 797 static const bool has_infinity = false; 798 static const bool has_quiet_NaN = false; 799 static const bool has_signaling_NaN = false; 800 static const float_denorm_style has_denorm = denorm_absent; 801 static const bool has_denorm_loss = false; 802 803 static int infinity() throw() 804 { return static_cast<int>(0); } 805 static int quiet_NaN() throw() 806 { return static_cast<int>(0); } 807 static int signaling_NaN() throw() 808 { return static_cast<int>(0); } 809 static int denorm_min() throw() 810 { return static_cast<int>(0); } 811 812 static const bool is_iec559 = false; 813 static const bool is_bounded = true; 814 static const bool is_modulo = true; 815 816 static const bool traps = __glibcxx_integral_traps; 817 static const bool tinyness_before = false; 818 static const float_round_style round_style = round_toward_zero; 819 }; 820 821 /// numeric_limits<unsigned int> specialization. 822 template<> 823 struct numeric_limits<unsigned int> 824 { 825 static const bool is_specialized = true; 826 827 static unsigned int min() throw() 828 { return 0; } 829 static unsigned int max() throw() 830 { return __INT_MAX__ * 2U + 1; } 831 832 static const int digits = __glibcxx_digits (unsigned int); 833 static const int digits10 = __glibcxx_digits10 (unsigned int); 834 static const bool is_signed = false; 835 static const bool is_integer = true; 836 static const bool is_exact = true; 837 static const int radix = 2; 838 static unsigned int epsilon() throw() 839 { return 0; } 840 static unsigned int round_error() throw() 841 { return 0; } 842 843 static const int min_exponent = 0; 844 static const int min_exponent10 = 0; 845 static const int max_exponent = 0; 846 static const int max_exponent10 = 0; 847 848 static const bool has_infinity = false; 849 static const bool has_quiet_NaN = false; 850 static const bool has_signaling_NaN = false; 851 static const float_denorm_style has_denorm = denorm_absent; 852 static const bool has_denorm_loss = false; 853 854 static unsigned int infinity() throw() 855 { return static_cast<unsigned int>(0); } 856 static unsigned int quiet_NaN() throw() 857 { return static_cast<unsigned int>(0); } 858 static unsigned int signaling_NaN() throw() 859 { return static_cast<unsigned int>(0); } 860 static unsigned int denorm_min() throw() 861 { return static_cast<unsigned int>(0); } 862 863 static const bool is_iec559 = false; 864 static const bool is_bounded = true; 865 static const bool is_modulo = true; 866 867 static const bool traps = __glibcxx_integral_traps; 868 static const bool tinyness_before = false; 869 static const float_round_style round_style = round_toward_zero; 870 }; 871 872 /// numeric_limits<long> specialization. 873 template<> 874 struct numeric_limits<long> 875 { 876 static const bool is_specialized = true; 877 878 static long min() throw() 879 { return -__LONG_MAX__ - 1; } 880 static long max() throw() 881 { return __LONG_MAX__; } 882 883 static const int digits = __glibcxx_digits (long); 884 static const int digits10 = __glibcxx_digits10 (long); 885 static const bool is_signed = true; 886 static const bool is_integer = true; 887 static const bool is_exact = true; 888 static const int radix = 2; 889 static long epsilon() throw() 890 { return 0; } 891 static long round_error() throw() 892 { return 0; } 893 894 static const int min_exponent = 0; 895 static const int min_exponent10 = 0; 896 static const int max_exponent = 0; 897 static const int max_exponent10 = 0; 898 899 static const bool has_infinity = false; 900 static const bool has_quiet_NaN = false; 901 static const bool has_signaling_NaN = false; 902 static const float_denorm_style has_denorm = denorm_absent; 903 static const bool has_denorm_loss = false; 904 905 static long infinity() throw() 906 { return static_cast<long>(0); } 907 static long quiet_NaN() throw() 908 { return static_cast<long>(0); } 909 static long signaling_NaN() throw() 910 { return static_cast<long>(0); } 911 static long denorm_min() throw() 912 { return static_cast<long>(0); } 913 914 static const bool is_iec559 = false; 915 static const bool is_bounded = true; 916 static const bool is_modulo = true; 917 918 static const bool traps = __glibcxx_integral_traps; 919 static const bool tinyness_before = false; 920 static const float_round_style round_style = round_toward_zero; 921 }; 922 923 /// numeric_limits<unsigned long> specialization. 924 template<> 925 struct numeric_limits<unsigned long> 926 { 927 static const bool is_specialized = true; 928 929 static unsigned long min() throw() 930 { return 0; } 931 static unsigned long max() throw() 932 { return __LONG_MAX__ * 2UL + 1; } 933 934 static const int digits = __glibcxx_digits (unsigned long); 935 static const int digits10 = __glibcxx_digits10 (unsigned long); 936 static const bool is_signed = false; 937 static const bool is_integer = true; 938 static const bool is_exact = true; 939 static const int radix = 2; 940 static unsigned long epsilon() throw() 941 { return 0; } 942 static unsigned long round_error() throw() 943 { return 0; } 944 945 static const int min_exponent = 0; 946 static const int min_exponent10 = 0; 947 static const int max_exponent = 0; 948 static const int max_exponent10 = 0; 949 950 static const bool has_infinity = false; 951 static const bool has_quiet_NaN = false; 952 static const bool has_signaling_NaN = false; 953 static const float_denorm_style has_denorm = denorm_absent; 954 static const bool has_denorm_loss = false; 955 956 static unsigned long infinity() throw() 957 { return static_cast<unsigned long>(0); } 958 static unsigned long quiet_NaN() throw() 959 { return static_cast<unsigned long>(0); } 960 static unsigned long signaling_NaN() throw() 961 { return static_cast<unsigned long>(0); } 962 static unsigned long denorm_min() throw() 963 { return static_cast<unsigned long>(0); } 964 965 static const bool is_iec559 = false; 966 static const bool is_bounded = true; 967 static const bool is_modulo = true; 968 969 static const bool traps = __glibcxx_integral_traps; 970 static const bool tinyness_before = false; 971 static const float_round_style round_style = round_toward_zero; 972 }; 973 974 /// numeric_limits<long long> specialization. 975 template<> 976 struct numeric_limits<long long> 977 { 978 static const bool is_specialized = true; 979 980 static long long min() throw() 981 { return -__LONG_LONG_MAX__ - 1; } 982 static long long max() throw() 983 { return __LONG_LONG_MAX__; } 984 985 static const int digits = __glibcxx_digits (long long); 986 static const int digits10 = __glibcxx_digits10 (long long); 987 static const bool is_signed = true; 988 static const bool is_integer = true; 989 static const bool is_exact = true; 990 static const int radix = 2; 991 static long long epsilon() throw() 992 { return 0; } 993 static long long round_error() throw() 994 { return 0; } 995 996 static const int min_exponent = 0; 997 static const int min_exponent10 = 0; 998 static const int max_exponent = 0; 999 static const int max_exponent10 = 0; 1000 1001 static const bool has_infinity = false; 1002 static const bool has_quiet_NaN = false; 1003 static const bool has_signaling_NaN = false; 1004 static const float_denorm_style has_denorm = denorm_absent; 1005 static const bool has_denorm_loss = false; 1006 1007 static long long infinity() throw() 1008 { return static_cast<long long>(0); } 1009 static long long quiet_NaN() throw() 1010 { return static_cast<long long>(0); } 1011 static long long signaling_NaN() throw() 1012 { return static_cast<long long>(0); } 1013 static long long denorm_min() throw() 1014 { return static_cast<long long>(0); } 1015 1016 static const bool is_iec559 = false; 1017 static const bool is_bounded = true; 1018 static const bool is_modulo = true; 1019 1020 static const bool traps = __glibcxx_integral_traps; 1021 static const bool tinyness_before = false; 1022 static const float_round_style round_style = round_toward_zero; 1023 }; 1024 1025 /// numeric_limits<unsigned long long> specialization. 1026 template<> 1027 struct numeric_limits<unsigned long long> 1028 { 1029 static const bool is_specialized = true; 1030 1031 static unsigned long long min() throw() 1032 { return 0; } 1033 static unsigned long long max() throw() 1034 { return __LONG_LONG_MAX__ * 2ULL + 1; } 1035 1036 static const int digits = __glibcxx_digits (unsigned long long); 1037 static const int digits10 = __glibcxx_digits10 (unsigned long long); 1038 static const bool is_signed = false; 1039 static const bool is_integer = true; 1040 static const bool is_exact = true; 1041 static const int radix = 2; 1042 static unsigned long long epsilon() throw() 1043 { return 0; } 1044 static unsigned long long round_error() throw() 1045 { return 0; } 1046 1047 static const int min_exponent = 0; 1048 static const int min_exponent10 = 0; 1049 static const int max_exponent = 0; 1050 static const int max_exponent10 = 0; 1051 1052 static const bool has_infinity = false; 1053 static const bool has_quiet_NaN = false; 1054 static const bool has_signaling_NaN = false; 1055 static const float_denorm_style has_denorm = denorm_absent; 1056 static const bool has_denorm_loss = false; 1057 1058 static unsigned long long infinity() throw() 1059 { return static_cast<unsigned long long>(0); } 1060 static unsigned long long quiet_NaN() throw() 1061 { return static_cast<unsigned long long>(0); } 1062 static unsigned long long signaling_NaN() throw() 1063 { return static_cast<unsigned long long>(0); } 1064 static unsigned long long denorm_min() throw() 1065 { return static_cast<unsigned long long>(0); } 1066 1067 static const bool is_iec559 = false; 1068 static const bool is_bounded = true; 1069 static const bool is_modulo = true; 1070 1071 static const bool traps = __glibcxx_integral_traps; 1072 static const bool tinyness_before = false; 1073 static const float_round_style round_style = round_toward_zero; 1074 }; 1075 1076 /// numeric_limits<float> specialization. 1077 template<> 1078 struct numeric_limits<float> 1079 { 1080 static const bool is_specialized = true; 1081 1082 static float min() throw() 1083 { return __FLT_MIN__; } 1084 static float max() throw() 1085 { return __FLT_MAX__; } 1086 1087 static const int digits = __FLT_MANT_DIG__; 1088 static const int digits10 = __FLT_DIG__; 1089 static const bool is_signed = true; 1090 static const bool is_integer = false; 1091 static const bool is_exact = false; 1092 static const int radix = __FLT_RADIX__; 1093 static float epsilon() throw() 1094 { return __FLT_EPSILON__; } 1095 static float round_error() throw() 1096 { return 0.5F; } 1097 1098 static const int min_exponent = __FLT_MIN_EXP__; 1099 static const int min_exponent10 = __FLT_MIN_10_EXP__; 1100 static const int max_exponent = __FLT_MAX_EXP__; 1101 static const int max_exponent10 = __FLT_MAX_10_EXP__; 1102 1103 static const bool has_infinity = __FLT_HAS_INFINITY__; 1104 static const bool has_quiet_NaN = __FLT_HAS_QUIET_NAN__; 1105 static const bool has_signaling_NaN = has_quiet_NaN; 1106 static const float_denorm_style has_denorm 1107 = bool(__FLT_HAS_DENORM__) ? denorm_present : denorm_absent; 1108 static const bool has_denorm_loss = __glibcxx_float_has_denorm_loss; 1109 1110 static float infinity() throw() 1111 { return __builtin_huge_valf (); } 1112 static float quiet_NaN() throw() 1113 { return __builtin_nanf (""); } 1114 static float signaling_NaN() throw() 1115 { return __builtin_nansf (""); } 1116 static float denorm_min() throw() 1117 { return __FLT_DENORM_MIN__; } 1118 1119 static const bool is_iec559 1120 = has_infinity && has_quiet_NaN && has_denorm == denorm_present; 1121 static const bool is_bounded = true; 1122 static const bool is_modulo = false; 1123 1124 static const bool traps = __glibcxx_float_traps; 1125 static const bool tinyness_before = __glibcxx_float_tinyness_before; 1126 static const float_round_style round_style = round_to_nearest; 1127 }; 1128 1129 #undef __glibcxx_float_has_denorm_loss 1130 #undef __glibcxx_float_traps 1131 #undef __glibcxx_float_tinyness_before 1132 1133 /// numeric_limits<double> specialization. 1134 template<> 1135 struct numeric_limits<double> 1136 { 1137 static const bool is_specialized = true; 1138 1139 static double min() throw() 1140 { return __DBL_MIN__; } 1141 static double max() throw() 1142 { return __DBL_MAX__; } 1143 1144 static const int digits = __DBL_MANT_DIG__; 1145 static const int digits10 = __DBL_DIG__; 1146 static const bool is_signed = true; 1147 static const bool is_integer = false; 1148 static const bool is_exact = false; 1149 static const int radix = __FLT_RADIX__; 1150 static double epsilon() throw() 1151 { return __DBL_EPSILON__; } 1152 static double round_error() throw() 1153 { return 0.5; } 1154 1155 static const int min_exponent = __DBL_MIN_EXP__; 1156 static const int min_exponent10 = __DBL_MIN_10_EXP__; 1157 static const int max_exponent = __DBL_MAX_EXP__; 1158 static const int max_exponent10 = __DBL_MAX_10_EXP__; 1159 1160 static const bool has_infinity = __DBL_HAS_INFINITY__; 1161 static const bool has_quiet_NaN = __DBL_HAS_QUIET_NAN__; 1162 static const bool has_signaling_NaN = has_quiet_NaN; 1163 static const float_denorm_style has_denorm 1164 = bool(__DBL_HAS_DENORM__) ? denorm_present : denorm_absent; 1165 static const bool has_denorm_loss = __glibcxx_double_has_denorm_loss; 1166 1167 static double infinity() throw() 1168 { return __builtin_huge_val(); } 1169 static double quiet_NaN() throw() 1170 { return __builtin_nan (""); } 1171 static double signaling_NaN() throw() 1172 { return __builtin_nans (""); } 1173 static double denorm_min() throw() 1174 { return __DBL_DENORM_MIN__; } 1175 1176 static const bool is_iec559 1177 = has_infinity && has_quiet_NaN && has_denorm == denorm_present; 1178 static const bool is_bounded = true; 1179 static const bool is_modulo = false; 1180 1181 static const bool traps = __glibcxx_double_traps; 1182 static const bool tinyness_before = __glibcxx_double_tinyness_before; 1183 static const float_round_style round_style = round_to_nearest; 1184 }; 1185 1186 #undef __glibcxx_double_has_denorm_loss 1187 #undef __glibcxx_double_traps 1188 #undef __glibcxx_double_tinyness_before 1189 1190 /// numeric_limits<long double> specialization. 1191 template<> 1192 struct numeric_limits<long double> 1193 { 1194 static const bool is_specialized = true; 1195 1196 static long double min() throw() 1197 { return __LDBL_MIN__; } 1198 static long double max() throw() 1199 { return __LDBL_MAX__; } 1200 1201 static const int digits = __LDBL_MANT_DIG__; 1202 static const int digits10 = __LDBL_DIG__; 1203 static const bool is_signed = true; 1204 static const bool is_integer = false; 1205 static const bool is_exact = false; 1206 static const int radix = __FLT_RADIX__; 1207 static long double epsilon() throw() 1208 { return __LDBL_EPSILON__; } 1209 static long double round_error() throw() 1210 { return 0.5L; } 1211 1212 static const int min_exponent = __LDBL_MIN_EXP__; 1213 static const int min_exponent10 = __LDBL_MIN_10_EXP__; 1214 static const int max_exponent = __LDBL_MAX_EXP__; 1215 static const int max_exponent10 = __LDBL_MAX_10_EXP__; 1216 1217 static const bool has_infinity = __LDBL_HAS_INFINITY__; 1218 static const bool has_quiet_NaN = __LDBL_HAS_QUIET_NAN__; 1219 static const bool has_signaling_NaN = has_quiet_NaN; 1220 static const float_denorm_style has_denorm 1221 = bool(__LDBL_HAS_DENORM__) ? denorm_present : denorm_absent; 1222 static const bool has_denorm_loss 1223 = __glibcxx_long_double_has_denorm_loss; 1224 1225 static long double infinity() throw() 1226 { return __builtin_huge_vall (); } 1227 static long double quiet_NaN() throw() 1228 { return __builtin_nanl (""); } 1229 static long double signaling_NaN() throw() 1230 { return __builtin_nansl (""); } 1231 static long double denorm_min() throw() 1232 { return __LDBL_DENORM_MIN__; } 1233 1234 static const bool is_iec559 1235 = has_infinity && has_quiet_NaN && has_denorm == denorm_present; 1236 static const bool is_bounded = true; 1237 static const bool is_modulo = false; 1238 1239 static const bool traps = __glibcxx_long_double_traps; 1240 static const bool tinyness_before = __glibcxx_long_double_tinyness_before; 1241 static const float_round_style round_style = round_to_nearest; 1242 }; 1243 1244 #undef __glibcxx_long_double_has_denorm_loss 1245 #undef __glibcxx_long_double_traps 1246 #undef __glibcxx_long_double_tinyness_before 1247 1248 _GLIBCXX_END_NAMESPACE 1249 1250 #undef __glibcxx_signed 1251 #undef __glibcxx_min 1252 #undef __glibcxx_max 1253 #undef __glibcxx_digits 1254 #undef __glibcxx_digits10 1255 1256 #endif // _GLIBCXX_NUMERIC_LIMITS 1257