数值极限
std::numeric_limits
定义于头文件 <limits>
定义于头文件 | ||
template< class T > class numeric_limits; |
numeric_limits 类模板提供查询各种算术类型属性的标准化方式(例如 int 类型的最大可能值是 std::numeric_limits<int>::max() )。
10 的该数次幂是合法正规浮点值的最小负数
std::numeric_limits<T>::min_exponent10
static const int min_exponent10; | (C++11 前) | |
static constexpr int min_exponent10; | (C++11 起) |
std::numeric_limits<T>::min_exponent10 的值是满足 10n是浮点类型 T
的合法正规值的最低负数 n
。
标准特化
T | std::numeric_limits<T>::min_exponent10 的值 |
/* non-specialized */ | 0 |
bool | 0 |
char | 0 |
signed char | 0 |
unsigned char | 0 |
wchar_t | 0 |
char8_t | 0 |
char16_t | 0 |
char32_t | 0 |
short | 0 |
unsigned short | 0 |
int | 0 |
unsigned int | 0 |
long | 0 |
unsigned long | 0 |
long long | 0 |
unsigned long long | 0 |
float | FLT_MIN_10_EXP |
double | DBL_MIN_10_EXP |
long double | LDBL_MIN_10_EXP |
调用示例
#include <iostream>
#include <string>
#include <limits>
#include <cstdint>
#include <cfloat>
struct SName
{
};
//偏特化
struct SPartSpec
{
};
namespace std
{
template<>
struct numeric_limits<SPartSpec>
{
static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
static _GLIBCXX_USE_CONSTEXPR bool has_infinity = true;
static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = true;
static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = true;
static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm = denorm_present;
static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = true;
static _GLIBCXX_USE_CONSTEXPR float_round_style round_style = round_toward_neg_infinity;
static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = true;
static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
static _GLIBCXX_USE_CONSTEXPR int digits = CHAR_BIT;
static _GLIBCXX_USE_CONSTEXPR int digits10 = CHAR_BIT;
static _GLIBCXX_USE_CONSTEXPR int max_digits10 = DECIMAL_DIG;
static _GLIBCXX_USE_CONSTEXPR int radix = FLT_RADIX;
static _GLIBCXX_USE_CONSTEXPR int min_exponent = FLT_MIN_EXP;
static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = FLT_MIN_10_EXP;
};
}
int main()
{
std::cout << std::boolalpha;
std::cout << "std::numeric_limits<bool>::min_exponent10: "
<< std::numeric_limits<bool>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<char>::min_exponent10: "
<< std::numeric_limits<char>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<signed char>::min_exponent10: "
<< std::numeric_limits<signed char>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<unsigned char>::min_exponent10: "
<< std::numeric_limits<unsigned char>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<wchar_t>::min_exponent10: "
<< std::numeric_limits<wchar_t>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<char16_t>::min_exponent10: "
<< std::numeric_limits<char16_t>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<char32_t>::min_exponent10: "
<< std::numeric_limits<char32_t>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<short>::min_exponent10: "
<< std::numeric_limits<short>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<unsigned short>::min_exponent10: "
<< std::numeric_limits<unsigned short>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<int>::min_exponent10: "
<< std::numeric_limits<int>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<unsigned int>::min_exponent10: "
<< std::numeric_limits<unsigned int>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<long>::min_exponent10: "
<< std::numeric_limits<long>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<unsigned long>::min_exponent10: "
<< std::numeric_limits<unsigned long>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<long long>::min_exponent10: "
<< std::numeric_limits<long long>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<unsigned long long>::min_exponent10: "
<< std::numeric_limits<unsigned long long>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<float>::min_exponent10: "
<< std::numeric_limits<float>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<double>::min_exponent10: "
<< std::numeric_limits<double>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<long double>::min_exponent10: "
<< std::numeric_limits<long double>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<std::string>::min_exponent10: "
<< std::numeric_limits<std::string>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<SName>::min_exponent10: "
<< std::numeric_limits<SName>::min_exponent10 << std::endl;
std::cout << "std::numeric_limits<SPartSpec>::min_exponent10: "
<< std::numeric_limits<SPartSpec>::min_exponent10 << std::endl;
return 0;
}
输出
底的该数次幂是合法有限浮点值的最大整数加一
std::numeric_limits<T>::max_exponent
static const int max_exponent; | (C++11 前) | |
static constexpr int max_exponent; | (C++11 起) |
std::numeric_limits<T>::max_exponent 的值是满足 rn-1是浮点类型 T
的可表示有限值最大正整数 n
,其中 r
是 std::numeric_limits<T>::radix 。
标准特化
T | std::numeric_limits<T>::max_exponent 的值 |
/* non-specialized */ | 0 |
bool | 0 |
char | 0 |
signed char | 0 |
unsigned char | 0 |
wchar_t | 0 |
char8_t | 0 |
char16_t | 0 |
char32_t | 0 |
short | 0 |
unsigned short | 0 |
int | 0 |
unsigned int | 0 |
long | 0 |
unsigned long | 0 |
long long | 0 |
unsigned long long | 0 |
float | FLT_MAX_EXP |
double | DBL_MAX_EXP |
long double | LDBL_MAX_EXP |
调用示例
#include <iostream>
#include <string>
#include <limits>
#include <cstdint>
#include <cfloat>
struct SName
{
};
//偏特化
struct SPartSpec
{
};
namespace std
{
template<>
struct numeric_limits<SPartSpec>
{
static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
static _GLIBCXX_USE_CONSTEXPR bool has_infinity = true;
static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = true;
static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = true;
static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm = denorm_present;
static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = true;
static _GLIBCXX_USE_CONSTEXPR float_round_style round_style = round_toward_neg_infinity;
static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = true;
static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
static _GLIBCXX_USE_CONSTEXPR int digits = CHAR_BIT;
static _GLIBCXX_USE_CONSTEXPR int digits10 = CHAR_BIT;
static _GLIBCXX_USE_CONSTEXPR int max_digits10 = DECIMAL_DIG;
static _GLIBCXX_USE_CONSTEXPR int radix = FLT_RADIX;
static _GLIBCXX_USE_CONSTEXPR int min_exponent = FLT_MIN_EXP;
static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = FLT_MIN_10_EXP;
static _GLIBCXX_USE_CONSTEXPR int max_exponent = FLT_MAX_EXP;
};
}
int main()
{
std::cout << std::boolalpha;
std::cout << "std::numeric_limits<bool>::max_exponent: "
<< std::numeric_limits<bool>::max_exponent << std::endl;
std::cout << "std::numeric_limits<char>::max_exponent: "
<< std::numeric_limits<char>::max_exponent << std::endl;
std::cout << "std::numeric_limits<signed char>::max_exponent: "
<< std::numeric_limits<signed char>::max_exponent << std::endl;
std::cout << "std::numeric_limits<unsigned char>::max_exponent: "
<< std::numeric_limits<unsigned char>::max_exponent << std::endl;
std::cout << "std::numeric_limits<wchar_t>::max_exponent: "
<< std::numeric_limits<wchar_t>::max_exponent << std::endl;
std::cout << "std::numeric_limits<char16_t>::max_exponent: "
<< std::numeric_limits<char16_t>::max_exponent << std::endl;
std::cout << "std::numeric_limits<char32_t>::max_exponent: "
<< std::numeric_limits<char32_t>::max_exponent << std::endl;
std::cout << "std::numeric_limits<short>::max_exponent: "
<< std::numeric_limits<short>::max_exponent << std::endl;
std::cout << "std::numeric_limits<unsigned short>::max_exponent: "
<< std::numeric_limits<unsigned short>::max_exponent << std::endl;
std::cout << "std::numeric_limits<int>::max_exponent: "
<< std::numeric_limits<int>::max_exponent << std::endl;
std::cout << "std::numeric_limits<unsigned int>::max_exponent: "
<< std::numeric_limits<unsigned int>::max_exponent << std::endl;
std::cout << "std::numeric_limits<long>::max_exponent: "
<< std::numeric_limits<long>::max_exponent << std::endl;
std::cout << "std::numeric_limits<unsigned long>::max_exponent: "
<< std::numeric_limits<unsigned long>::max_exponent << std::endl;
std::cout << "std::numeric_limits<long long>::max_exponent: "
<< std::numeric_limits<long long>::max_exponent << std::endl;
std::cout << "std::numeric_limits<unsigned long long>::max_exponent: "
<< std::numeric_limits<unsigned long long>::max_exponent << std::endl;
std::cout << "std::numeric_limits<float>::max_exponent: "
<< std::numeric_limits<float>::max_exponent << std::endl;
std::cout << "std::numeric_limits<double>::max_exponent: "
<< std::numeric_limits<double>::max_exponent << std::endl;
std::cout << "std::numeric_limits<long double>::max_exponent: "
<< std::numeric_limits<long double>::max_exponent << std::endl;
std::cout << "std::numeric_limits<std::string>::max_exponent: "
<< std::numeric_limits<std::string>::max_exponent << std::endl;
std::cout << "std::numeric_limits<SName>::max_exponent: "
<< std::numeric_limits<SName>::max_exponent << std::endl;
std::cout << "std::numeric_limits<SPartSpec>::max_exponent: "
<< std::numeric_limits<SPartSpec>::max_exponent << std::endl;
return 0;
}
输出
10 的该数次幂是合法有限浮点值的最大整数
std::numeric_limits<T>::max_exponent10
std::numeric_limits<T>::max_exponent10 的值是满足 10n是浮点类型 T
的可表示有限值的最大正整数 n
。
标准特化
T | std::numeric_limits<T>::max_exponent10 的值 |
/* non-specialized */ | 0 |
bool | 0 |
char | 0 |
signed char | 0 |
unsigned char | 0 |
wchar_t | 0 |
char8_t | 0 |
char16_t | 0 |
char32_t | 0 |
short | 0 |
unsigned short | 0 |
int | 0 |
unsigned int | 0 |
long | 0 |
unsigned long | 0 |
long long | 0 |
unsigned long long | 0 |
float | FLT_MAX_10_EXP |
double | DBL_MAX_10_EXP |
long double | LDBL_MAX_10_EXP |
调用示例
#include <iostream>
#include <string>
#include <limits>
#include <cstdint>
#include <cfloat>
struct SName
{
};
//偏特化
struct SPartSpec
{
};
namespace std
{
template<>
struct numeric_limits<SPartSpec>
{
static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
static _GLIBCXX_USE_CONSTEXPR bool has_infinity = true;
static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = true;
static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = true;
static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm = denorm_present;
static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = true;
static _GLIBCXX_USE_CONSTEXPR float_round_style round_style = round_toward_neg_infinity;
static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = true;
static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
static _GLIBCXX_USE_CONSTEXPR int digits = CHAR_BIT;
static _GLIBCXX_USE_CONSTEXPR int digits10 = CHAR_BIT;
static _GLIBCXX_USE_CONSTEXPR int max_digits10 = DECIMAL_DIG;
static _GLIBCXX_USE_CONSTEXPR int radix = FLT_RADIX;
static _GLIBCXX_USE_CONSTEXPR int min_exponent = FLT_MIN_EXP;
static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = FLT_MIN_10_EXP;
static _GLIBCXX_USE_CONSTEXPR int max_exponent = FLT_MAX_EXP;
static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = FLT_MAX_EXP;
};
}
int main()
{
std::cout << std::boolalpha;
std::cout << "std::numeric_limits<bool>::max_exponent10: "
<< std::numeric_limits<bool>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<char>::max_exponent10: "
<< std::numeric_limits<char>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<signed char>::max_exponent10: "
<< std::numeric_limits<signed char>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<unsigned char>::max_exponent10: "
<< std::numeric_limits<unsigned char>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<wchar_t>::max_exponent10: "
<< std::numeric_limits<wchar_t>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<char16_t>::max_exponent10: "
<< std::numeric_limits<char16_t>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<char32_t>::max_exponent10: "
<< std::numeric_limits<char32_t>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<short>::max_exponent10: "
<< std::numeric_limits<short>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<unsigned short>::max_exponent10: "
<< std::numeric_limits<unsigned short>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<int>::max_exponent10: "
<< std::numeric_limits<int>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<unsigned int>::max_exponent10: "
<< std::numeric_limits<unsigned int>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<long>::max_exponent10: "
<< std::numeric_limits<long>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<unsigned long>::max_exponent10: "
<< std::numeric_limits<unsigned long>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<long long>::max_exponent10: "
<< std::numeric_limits<long long>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<unsigned long long>::max_exponent10: "
<< std::numeric_limits<unsigned long long>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<float>::max_exponent10: "
<< std::numeric_limits<float>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<double>::max_exponent10: "
<< std::numeric_limits<double>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<long double>::max_exponent10: "
<< std::numeric_limits<long double>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<std::string>::max_exponent10: "
<< std::numeric_limits<std::string>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<SName>::max_exponent10: "
<< std::numeric_limits<SName>::max_exponent10 << std::endl;
std::cout << "std::numeric_limits<SPartSpec>::max_exponent10: "
<< std::numeric_limits<SPartSpec>::max_exponent10 << std::endl;
return 0;
}