C++(标准库):07---数值的极值(numeric_limits类)
原创
©著作权归作者所有:来自51CTO博客作者董哥的黑板报的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、数值的极值概述
- 数值类型有着与平台相依的极值
- C++标准规定了各种类型必须保证的最小精度。这些最小值如下图所示:
二、numeric_limits
-
传统C语言使用预处理器常量来决定数值的极值,其中整数常量定义于<climits>或<limits.h>中,浮点常量定义于<cfloat>或<float.h>中
- C++标准库定义一个template numeric_limits来提供这些常值
-
使用numeric_limits有优点:
- 第一个是提供更好的类型安全性
- 第二个是程序员可以借此写出一些template以核定这些极值
- 使用numeric_limits可以很轻松的写出跨平台的程序
三、numeric_limits的实现
-
numeric_limits实现有两种:
- 一种是通用性的模板,其提供很多接口,是每个类型都共用的
- 一种是特化版本的,每特定的类型特例化
通用性的numeric_limits
- 通用性的template如下,为所有类型提供默认极值:
-
这里把成员is_specialized设为false,意思为对于类型T而言,不存在所谓的极值
特化版本的numeric_limits
-
这里把is_specialized设为true,所有其他成员都根据特定类型的具体极值而设定
-
特化版本涵盖所有数值基础类型,包括:bool、char、signed char、unsigned char、char16_t、char32_t、wchar_t、short、unsigned short、int、unsigned int、long、unsigned long、long long、unsigned long long、float、double、long double
- 当然你也可以为自己定义的数值类型定义一份特例化
- 例如下面是对float极值的一份全特化版本:
四、numeric_limits提供的操作
-
numeric_limits定义在<limits>头文件中,下图列出了所有成员及其意义,最右侧对应的是C常量
- C++11前并不提供lowest()和max_digits10,且所有成员函数不提供noexcept
所有成员都是constexpr的
- 从C++11起,所有成员都被声明为constexpr的
- 例如你可以在需要编译期表达式的地方使用max():
static const int ERROR_VALUE = std::numeric_limits<int>::max();
float a[std::numeric_limits<short>::max()];
round_style、has_denorm
-
如果denorm_absent为0就等于false;如果denorm_absent为1而且denorm_indeterminats为-1,那么两者都等于true。因此你可以把has_denorm视为一个bool值,用以判定某个类型是否允许所谓的denormalized value
五、numeric_limits使用示例
演示案例1
cout << "max(short)" << numeric_limits<short>::max() << endl;
cout << "max(int)" << numeric_limits<int>::max() << endl;
cout << "max(long)" << numeric_limits<long>::max() << endl << endl;
cout << "max(float)" << numeric_limits<float>::max() << endl;
cout << "max(double)" << numeric_limits<double>::max() << endl;
cout << "max(long double)" << numeric_limits<long double>::max() << endl << endl;
演示案例2
- 下面查看char类型是否带有正负号,string类型是否带有极值
cout << boolalpha;
cout << "is_signed(char)" << numeric_limits<char>::is_signed << endl;
cout << "is_specialized(string)" << numeric_limits<string>::is_specialized << endl;