定义于头文件
| 定义于头文件 | ||
| template< class T > class numeric_limits; |
numeric_limits 类模板提供查询各种算术类型属性的标准化方式(例如 int 类型的最大可能值是 std::numeric_limits
std::numeric_limits<T>::has_signaling_NaN
| static const bool has_signaling_NaN; | ||
| static constexpr bool has_signaling_NaN; |
std::numeric_limitsT 为 true 。此常量对所有浮点类型有意义,并保证若 std::numeric_limits
T | std::numeric_limits |
| /* non-specialized */ | false |
| bool | false |
| char | false |
| signed char | false |
| unsigned char | false |
| wchar_t | false |
| char8_t | false |
| char16_t | false |
| char32_t | false |
| short | false |
| unsigned short | false |
| int | false |
| unsigned int | false |
| long | false |
| unsigned long | false |
| long long | false |
| unsigned long long | false |
| float | 通常为 true |
| double | 通常为 true |
| long double | 通常为 true |
- #include <iostream>
- #include <string>
- #include <limits>
-
- 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 float_denorm_style has_denorm_loss = denorm_present;
- };
- }
-
- int main()
- {
- std::cout << std::boolalpha;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<bool>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<char>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<signed char>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<unsigned char>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<wchar_t>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<char16_t>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<char32_t>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<short>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<unsigned short>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<int>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<unsigned int>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<long>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<unsigned long>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<long long>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<unsigned long long>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<float>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<double>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<long double>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<std::string>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<SName>::has_signaling_NaN << std::endl;
- std::cout << "std::numeric_limits
::has_signaling_NaN: " - << std::numeric_limits<SPartSpec>::has_signaling_NaN << std::endl;
- return 0;
- }

std::numeric_limits<T>::has_denorm
std::numeric_limits
T | std::numeric_limits |
| /* non-specialized */ | std::denorm_absent |
| bool | std::denorm_absent |
| char | std::denorm_absent |
| signed char | std::denorm_absent |
| unsigned char | std::denorm_absent |
| wchar_t | std::denorm_absent |
| char8_t | std::denorm_absent |
| char16_t | std::denorm_absent |
| char32_t | std::denorm_absent |
| short | std::denorm_absent |
| unsigned short | std::denorm_absent |
| int | std::denorm_absent |
| unsigned int | std::denorm_absent |
| long | std::denorm_absent |
| unsigned long | std::denorm_absent |
| long long | std::denorm_absent |
| unsigned long long | std::denorm_absent |
| float | 通常为 std::denorm_present |
| double | 通常为 std::denorm_present |
| long double | 通常为 std::denorm_present |
- #include <iostream>
- #include <string>
- #include <limits>
-
- 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 float_denorm_style has_denorm_loss = denorm_present;
- };
- }
-
- int main()
- {
- std::cout << std::boolalpha;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<bool>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<char>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<signed char>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<unsigned char>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<wchar_t>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<char16_t>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<char32_t>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<short>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<unsigned short>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<int>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<unsigned int>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<long>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<unsigned long>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<long long>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<unsigned long long>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<float>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<double>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<long double>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<std::string>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<SName>::has_denorm << std::endl;
- std::cout << "std::numeric_limits
::has_denorm: " - << std::numeric_limits<SPartSpec>::has_denorm << std::endl;
- return 0;
- }

std::numeric_limits<T>::has_denorm_loss
| static const bool has_denorm_loss; | (C++11 前) | |
| static constexpr bool has_denorm_loss; | (C++11 起) |
T | std::numeric_limits |
| /* non-specialized */ | false |
| bool | false |
| char | false |
| signed char | false |
| unsigned char | false |
| wchar_t | false |
| char8_t | false |
| char16_t | false |
| char32_t | false |
| short | false |
| unsigned short | false |
| int | false |
| unsigned int | false |
| long | false |
| unsigned long | false |
| long long | false |
| unsigned long long | false |
| float | 实现定义 |
| double | 实现定义 |
| long double | 实现定义 |
与标准一致的非正规数的 IEEE 754 浮点实现要求检测关联到创建这种数的精度损失,若它出现,而且可以以二种迥异的方式进行:
1) 非正规化损失:产生的结果异于假如指数范围无界的情况下计算出的结果。
2) 不准确结果:产生的结果异于假如指数范围和精度均无界的情况下计算出的结果。
不存在非正规化损失机制的实现(精度损失在舍入后检测为不准确结果),而此选项在 IEEE 标准 754 的 2008 修订版被移除。
libstdc++ 、 libc++ 、 libCstd 及 stlport4 为所有浮点类型定义此常量为 false 。 Microsoft Visual Studio 为所有浮点类型定义它为 true 。
同任何浮点计算,精度损失可能引发 FE_INEXACT
- #include <iostream>
- #include <string>
- #include <limits>
-
- 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;
- };
- }
-
- int main()
- {
- std::cout << std::boolalpha;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<bool>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<char>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<signed char>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<unsigned char>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<wchar_t>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<char16_t>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<char32_t>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<short>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<unsigned short>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<int>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<unsigned int>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<long>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<unsigned long>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<long long>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<unsigned long long>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<float>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<double>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<long double>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<std::string>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<SName>::has_denorm_loss << std::endl;
- std::cout << "std::numeric_limits
::has_denorm_loss: " - << std::numeric_limits<SPartSpec>::has_denorm_loss << std::endl;
- return 0;
- }
