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