c/c++中经常会涉及到获取内置数据类型(int,float,double)的极大值或极小值,结合STL的numeric_limits可以很轻松地实现,实际上c语言也自带了一些极值的宏。下面分别介绍通过STL的numeric_limits获取极值和通过c语言的头文件的宏获取极值的方法。
1.STL的numeric_limits方法
numeric_limits是STL中表示内置数据类型的算术性质的模板类。(MSDN:The template class describes arithmetic properties of built-in numerical types。)这里只介绍获取极值的方法。
求极大值,numeric_limits<T>::max(),其中T表示内置数据类型,可以为int,unsigned int,double等等。
求极小值,numeric_limits<T>::min(),T的含义同上。
例子:(来源于MSDN)
cout << "The maximum value for type float is: " << numeric_limits<float>::max( ) << endl; cout<< "The maximum value for type double is: " << numeric_limits<double>::max( )<< endl;
说明:
1)有人可能不明白numeric_limits<float>::max( )这个函数为什么可以调用,实际上类的静态函数可以采取classname::func()这样的调用方式,而无需新建一个类的实例。当然要确保惊天函数中不能涉及到类的非静态成员变量的操作,否则程序编译会报错。
2)在有些情况下,numeric_limits<double>::max()会报错,原因是与windef.h中的max宏定义冲突了。这个非常雷人,解决方法也很简单,将numeric_limits<double>::max(),用括号括起来即可。(numeric_limits<double>::max)()(参考:http://www.codelast.com/?p=1653)
2.通过宏获取极大值极小值既然c/c++已经规定了每个内置类型所占字节数,因此每个内置类型的极值肯定是固定的,既然这样c/c++是否在提供获取极值的方法呢?答案是肯定的,在float.h和limits.h中包含了类置类型的极值的宏定义。
如在float.h中,有如下宏定义(本文只截取部分代码,感兴趣的可以自己去看该文件。该文件主要是浮点型的极值等性质)
#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define DBL_MAX 1.7976931348623158e+308 /* max value */
#define DBL_MIN 2.2250738585072014e-308 /* min positive value */
#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define FLT_MAX 3.402823466e+38F /* max value */
#define FLT_MIN 1.175494351e-38F /* min positive value */
#define LDBL_MAX DBL_MAX /* max value */
在limits.h中包含了整型等的极值,如
#define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */
#define INT_MAX 2147483647 /* maximum (signed) int value */
#define UINT_MAX 0xffffffff /* maximum unsigned int value */
#define LONG_MIN (-2147483647L - 1) /* minimum (signed) long value */
#define LONG_MAX 2147483647L /* maximum (signed) long value */