std::numeric_limits的min、max和lowest在C++中的区别
limit 头文件中的 std::numeric_limits
std :: numeric_limits
对于 整数 类型和 浮点数 数据类型,函数 max() 返回可表示的最大值,并且在数轴上的该值右侧没有其他值。
std::numeric_limits
对于 整数 类型和 浮点数 数据类型,函数 lowest() 返回可表示的最小值,并且在数轴上的该值左侧没有其他值。函数 lowest() 基本上是 max() 的负值。
std::numeric_limits
对于具有非规格化的 浮点数类型 ,函数 min() 返回最小正规化值。由于函数 min() 返回浮点数类型的最小正规化值,因此该值的指数不能为 0 。
要获取最小的正的非规格化值,请使用 std::numeric_limits
对于 整数类型 , min() 是函数 lowest() 的别名,这意味着两者都返回相同的最小有限值。 如果整数值的min()类似于浮点类型,则该值将为1。
例如:
类型 T | 字节大小 | 功能 | 二进制表示 | 值
—|—|—|—|—
int | 4 | max() | 01111111111111111111111111111111 | 2147483647
lowest() | 10000000000000000000000000000000 | -2147483648
min() | 10000000000000000000000000000000 | -2147483648
denorm_min() | 00000000000000000000000000000000 | 0
float | 4 | max() | 0 | 11111110 | 11111111111111111111111 | 3.40282346639e+38
lowest() | 1 | 11111110 | 11111111111111111111111 | -3.40282346639e+38
min() | 0 | 00000001 | 00000000000000000000000 | 1.17549435082e-38
0 | 00000000 | 00000000000000000000001 | 1.40129846432e-45
denorm_min()
下面是展示上述概念的程序:
// 用C++编写的程序,演示了numeric_limits min、max和lowest之间的差异
#include <bitset>
#include <iostream>
#include <limits>
using namespace std;
// 程序入口
int main()
{
int x;
// int的大小
cout << "int " << sizeof(int)
<< " 字节" << endl;
// numeric_limits<int>::max()
x = numeric_limits<int>::max();
cout << "\tmax :" << endl
<< bitset<8 * sizeof(x)>(x)
<< endl
<< x << endl;
// numeric_limits<int>::lowest()
x = numeric_limits<int>::lowest();
cout << "\tlowest :" << endl
<< bitset<8 * sizeof(x)>(x)
<< endl
<< x << endl;
// numeric_limits<int>::min()
x = numeric_limits<int>::min();
cout << "\tmin :" << endl
<< bitset<8 * sizeof(x)>(x)
<< endl
<< x << endl;
// numeric_limits<int>::denorm_min()
x = numeric_limits<int>::denorm_min();
cout << "\tdenorm_min :" << endl
<< bitset<8 * sizeof(x)>(x)
<< endl
<< x << endl;
cout << endl;
// float的大小
cout << "float " << sizeof(float)
<< " 字节" << endl;
float f;
// numeric_limits<int>::max()
f = numeric_limits<float>::max();
// 读取浮点数的二进制表示形式为整数
x = *(int*)&f
cout << "\tmax :" << endl
<< bitset<8 * sizeof(x)>(x)
<< endl
<< f << endl;
// numeric_limits<int>::lowest()
f = numeric_limits<float>::lowest();
x = *(int*)&f
cout << "\tlowest :" << endl
<< bitset<8 * sizeof(x)>(x)
<< endl
<< f << endl;
// numeric_limits<int>::min()
f = numeric_limits<float>::min();
x = *(int*)&f
cout << "\tmin :" << endl
<< bitset<8 * sizeof(x)>(x)
<< endl
<< f << endl;
// numeric_limits<int>::denorm_min()
f = numeric_limits<float>::denorm_min();
x = *(int*)&f
cout << "\tdenorm_min :" << endl
<< bitset<8 * sizeof(x)>(x)
<< endl
<< f << endl;
return 0;
}
int 4 字节
max :
01111111111111111111111111111111
2147483647
lowest :
10000000000000000000000000000000
-2147483648
min:
10000000000000000000000000000000
-2147483648
denorm_min :
00000000000000000000000000000000
0
float 4 字节
max :
01111111011111111111111111111111
3.40282e+38
lowest :
11111111011111111111111111111111
-3.40282e+38
min :
00000000100000000000000000000000
1.17549e-38
denorm_min :
00000000000000000000000000000001
1.4013e-45
注意: 在C++中,精度默认为6,这意味着最多使用6个有效位数来表示数字,因此实际数字与打印的值不同。要获得实际值,请尝试设置更高的精度。
以下程序演示了相同的内容:
// C++程序,用于说明上述概念
#include <bitset>
#include <iomanip>
#include <iostream>
#include <limits>
using namespace std;
// 主函数
int main()
{
// 输出结果不准确
cout << "\t最小值:" << endl
<< numeric_limits<float>::lowest()
<< endl;
// 从输出结果得到的值
float f = -3.40282e+38;
int x = *(int*)&f;
cout << bitset<8 * sizeof(x)>(x)
<< endl
<< endl;
// 正确的值
f = numeric_limits<float>::lowest();
x = *(int*)&f;
cout << "\tnumeric_limits<float>::lowest() :"
<< endl
<< bitset<8 * sizeof(x)>(x)
<< endl
<< endl;
cout << "\t使用 setprecision :"
<< endl;
// 输出结果更精确
cout << setprecision(10) << f << endl;
// 从输出结果得到的值
f = -3.402823466e+38;
// 将float的二进制表示作为整数读取
x = *(int*)&f;
cout << bitset<8 * sizeof(x)>(x)
<< endl;
return 0;
}
最小值:
-3.40282e+38
11111111011111111111111111101110
numeric_limits::lowest() :
11111111011111111111111111111111
使用 setprecision :
-3.402823466e+38
11111111011111111111111111111111