📄 limits
字号:
// The template and inlines for the -*- C++ -*- numeric_limits classes.// Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.//// This file is part of the GNU ISO C++ Library. This library is free// software; you can redistribute it and/or modify it under the// terms of the GNU General Public License as published by the// Free Software Foundation; either version 2, or (at your option)// any later version.// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License along// with this library; see the file COPYING. If not, write to the Free// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,// USA.// As a special exception, you may use this file as part of a free software// library without restriction. Specifically, if other files instantiate// templates or use macros or inline functions from this file, or you compile// this file and link it with other files to produce an executable, this// file does not by itself cause the resulting executable to be covered by// the GNU General Public License. This exception does not however// invalidate any other reasons why the executable file might be covered by// the GNU General Public License./** @file limits * This is a Standard C++ Library header. */// Note: this is not a conforming implementation.// Written by Gabriel Dos Reis <gdr@codesourcery.com>//// ISO 14882:1998// 18.2.1//#ifndef _GLIBCXX_NUMERIC_LIMITS#define _GLIBCXX_NUMERIC_LIMITS 1#define __glibcxx_signed(T) ((T)(-1) < 0)// You should not need to define any macros below this point.namespace std{ /** * @brief Describes the rounding style for floating-point types. * * This is used in the std::numeric_limits class. */ enum float_round_style { round_indeterminate = -1, ///< Self-explanatory. round_toward_zero = 0, ///< Self-explanatory. round_to_nearest = 1, ///< To the nearest representable value. round_toward_infinity = 2, ///< Self-explanatory. round_toward_neg_infinity = 3 ///< Self-explanatory. }; /** * @brief Describes the denormalization for floating-point types. * * These values represent the presence or absence of a variable number * of exponent bits. This type is used in the std::numeric_limits class. */ enum float_denorm_style { /// Indeterminate at compile time whether denormalized values are allowed. denorm_indeterminate = -1, /// The type does not allow denormalized values. denorm_absent = 0, /// The type allows denormalized values. denorm_present = 1 }; /** * @brief Part of std::numeric_limits. * * The @c static @c const members are usable as integral constant * expressions. * * @note This is a seperate class for purposes of efficiency; you * should only access these members as part of an instantiation * of the std::numeric_limits class. */ struct __numeric_limits_base { /** This will be true for all fundamental types (which have specializations), and false for everything else. */ static const bool is_specialized = false; /** The number of @c radix digits that be represented without change: for integer types, the number of non-sign bits in the mantissa; for floating types, the number of @c radix digits in the mantissa. */ static const int digits = 0; /** The number of base 10 digits that can be represented without change. */ static const int digits10 = 0; /** True if the type is signed. */ static const bool is_signed = false; /** True if the type is integer. * @if maint * Is this supposed to be "if the type is integral"? * @endif */ static const bool is_integer = false; /** True if the type uses an exact representation. "All integer types are exact, but not all exact types are integer. For example, rational and fixed-exponent representations are exact but not integer." [18.2.1.2]/15 */ static const bool is_exact = false; /** For integer types, specifies the base of the representation. For floating types, specifies the base of the exponent representation. */ static const int radix = 0; /** The minimum negative integer such that @c radix raised to the power of (one less than that integer) is a normalized floating point number. */ static const int min_exponent = 0; /** The minimum negative integer such that 10 raised to that power is in the range of normalized floating point numbers. */ static const int min_exponent10 = 0; /** The maximum positive integer such that @c radix raised to the power of (one less than that integer) is a representable finite floating point number. */ static const int max_exponent = 0; /** The maximum positive integer such that 10 raised to that power is in the range of representable finite floating point numbers. */ static const int max_exponent10 = 0; /** True if the type has a representation for positive infinity. */ static const bool has_infinity = false; /** True if the type has a representation for a quiet (non-signaling) "Not a Number." */ static const bool has_quiet_NaN = false; /** True if the type has a representation for a signaling "Not a Number." */ static const bool has_signaling_NaN = false; /** See std::float_denorm_style for more information. */ static const float_denorm_style has_denorm = denorm_absent; /** "True if loss of accuracy is detected as a denormalization loss, rather than as an inexact result." [18.2.1.2]/42 */ static const bool has_denorm_loss = false; /** True if-and-only-if the type adheres to the IEC 559 standard, also known as IEEE 754. (Only makes sense for floating point types.) */ static const bool is_iec559 = false; /** "True if the set of values representable by the type is finite. All built-in types are bounded, this member would be false for arbitrary precision types." [18.2.1.2]/54 */ static const bool is_bounded = false; /** True if the type is @e modulo, that is, if it is possible to add two positive numbers and have a result that wraps around to a third number that is less. Typically false for floating types, true for unsigned integers, and true for signed integers. */ static const bool is_modulo = false; /** True if trapping is implemented for this type. */ static const bool traps = false; /** True if tinyness is detected before rounding. (see IEC 559) */ static const bool tinyness_before = false; /** See std::float_round_style for more information. This is only meaningful for floating types; integer types will all be round_toward_zero. */ static const float_round_style round_style = round_toward_zero; }; /** * @brief Properties of fundamental types. * * This class allows a program to obtain information about the * representation of a fundamental type on a given platform. For * non-fundamental types, the functions will return 0 and the data * members will all be @c false. * * @if maint * _GLIBCXX_RESOLVE_LIB_DEFECTS: DRs 201 and 184 (hi Gaby!) are * noted, but not incorporated in this documented (yet). * @endif */ template<typename _Tp> struct numeric_limits : public __numeric_limits_base { /** The minimum finite value, or for floating types with denormalization, the minimum positive normalized value. */ static _Tp min() throw() { return static_cast<_Tp>(0); } /** The maximum finite value. */ static _Tp max() throw() { return static_cast<_Tp>(0); } /** The @e machine @e epsilon: the difference between 1 and the least value greater than 1 that is representable. */ static _Tp epsilon() throw() { return static_cast<_Tp>(0); } /** The maximum rounding error measurement (see LIA-1). */ static _Tp round_error() throw() { return static_cast<_Tp>(0); } /** The representation of positive infinity, if @c has_infinity. */ static _Tp infinity() throw() { return static_cast<_Tp>(0); } /** The representation of a quiet "Not a Number," if @c has_quiet_NaN. */ static _Tp quiet_NaN() throw() { return static_cast<_Tp>(0); } /** The representation of a signaling "Not a Number," if @c has_signaling_NaN. */ static _Tp signaling_NaN() throw() { return static_cast<_Tp>(0); } /** The minimum positive denormalized value. For types where @c has_denorm is false, this is the minimum positive normalized value. */ static _Tp denorm_min() throw() { return static_cast<_Tp>(0); } }; // Now there follow 15 explicit specializations. Yes, 15. Make sure // you get the count right. /// numeric_limits<bool> specialization. template<> struct numeric_limits<bool> { static const bool is_specialized = true; static bool min() throw() { return false; } static bool max() throw() { return true; } static const int digits = 1; static const int digits10 = 0; static const bool is_signed = false; static const bool is_integer = true; static const bool is_exact = true; static const int radix = 2; static bool epsilon() throw() { return false; } static bool round_error() throw() { return false; } static const int min_exponent = 0; static const int min_exponent10 = 0; static const int max_exponent = 0; static const int max_exponent10 = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const float_denorm_style has_denorm = denorm_absent; static const bool has_denorm_loss = false; static bool infinity() throw() { return false; } static bool quiet_NaN() throw() { return false; } static bool signaling_NaN() throw() { return false; } static bool denorm_min() throw() { return false; } static const bool is_iec559 = false; static const bool is_bounded = true; static const bool is_modulo = false; }; /// numeric_limits<char> specialization. template<> struct numeric_limits<char> { static const bool is_specialized = true; static char min() throw() { return CHAR_MIN; } static char max() throw() { return CHAR_MAX; } static const bool is_signed = __glibcxx_signed (char); static const bool is_integer = true; static const bool is_exact = true; static const int radix = 2; static char epsilon() throw() { return 0; } static char round_error() throw() { return 0; } static const int min_exponent = 0; static const int min_exponent10 = 0; static const int max_exponent = 0; static const int max_exponent10 = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const float_denorm_style has_denorm = denorm_absent; static const bool has_denorm_loss = false; static char infinity() throw() { return char(); } static char quiet_NaN() throw() { return char(); } static char signaling_NaN() throw() { return char(); } static char denorm_min() throw() { return static_cast<char>(0); } static const bool is_iec559 = false; static const bool is_bounded = true; static const bool is_modulo = true; }; /// numeric_limits<signed char> specialization. template<> struct numeric_limits<signed char> { static const bool is_specialized = true; static signed char min() throw() { return SCHAR_MIN; } static signed char max() throw() { return SCHAR_MAX; } static const bool is_signed = true; static const bool is_integer = true; static const bool is_exact = true; static const int radix = 2; static signed char epsilon() throw() { return 0; } static signed char round_error() throw() { return 0; } static const int min_exponent = 0; static const int min_exponent10 = 0; static const int max_exponent = 0; static const int max_exponent10 = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const float_denorm_style has_denorm = denorm_absent; static const bool has_denorm_loss = false; static signed char infinity() throw() { return static_cast<signed char>(0); } static signed char quiet_NaN() throw() { return static_cast<signed char>(0); } static signed char signaling_NaN() throw() { return static_cast<signed char>(0); } static signed char denorm_min() throw() { return static_cast<signed char>(0); } static const bool is_iec559 = false; static const bool is_bounded = true; static const bool is_modulo = true; }; /// numeric_limits<unsigned char> specialization. template<> struct numeric_limits<unsigned char> { static const bool is_specialized = true; static unsigned char min() throw() { return 0; } static unsigned char max() throw() { return UCHAR_MAX; } static const bool is_signed = false; static const bool is_integer = true; static const bool is_exact = true; static const int radix = 2; static unsigned char epsilon() throw() { return 0; } static unsigned char round_error() throw() { return 0; } static const int min_exponent = 0; static const int min_exponent10 = 0; static const int max_exponent = 0; static const int max_exponent10 = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const float_denorm_style has_denorm = denorm_absent; static const bool has_denorm_loss = false; static unsigned char infinity() throw() { return static_cast<unsigned char>(0); } static unsigned char quiet_NaN() throw() { return static_cast<unsigned char>(0); } static unsigned char signaling_NaN() throw() { return static_cast<unsigned char>(0); } static unsigned char denorm_min() throw() { return static_cast<unsigned char>(0); } static const bool is_iec559 = false; static const bool is_bounded = true; static const bool is_modulo = true; }; /// numeric_limits<wchar_t> specialization. template<> struct numeric_limits<wchar_t> { static const bool is_specialized = true; static wchar_t min() throw() { return WCHAR_MIN; } static wchar_t max() throw() { return WCHAR_MAX; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -