std::numeric_limits的min、max和lowest在C++中的区别

std::numeric_limits的min、max和lowest在C++中的区别

limit 头文件中的 std::numeric_limits ** 类为所有数值类型提供了 **min()max()lowest() 函数,以及其他成员函数。

std :: numeric_limits :: max(): ** 对于任何类型 **T ,都可以使用 std :: numeric_limits :: max() ** 获得数值类型 **T 可表示的最大有限值。 因此,函数 max() 返回数据类型 T 的值 x ,使得没有其他有限值 **y > x ** 。

对于 整数 类型和 浮点数 数据类型,函数 max() 返回可表示的最大值,并且在数轴上的该值右侧没有其他值。

std::numeric_limits ::lowest(): ** 对于任何类型 **T ,都可以使用 std::numeric_limits ::lowest() ** 获得数值类型 **T 可以表示的最小有限值,因此没有其他有限值 **y > x ** 。

对于 整数 类型和 浮点数 数据类型,函数 lowest() 返回可表示的最小值,并且在数轴上的该值左侧没有其他值。函数 lowest() 基本上是 max() 的负值。

std::numeric_limits ::min(): ** 对于任何类型 **T ,都可以使用 std::numeric_limits ::min() ** 获得数值类型 **T 可以表示的最小有限值。因此,函数 min() 返回类型 T 可以表示的最小可能值。

对于具有非规格化的 浮点数类型 ,函数 min() 返回最小正规化值。由于函数 min() 返回浮点数类型的最小正规化值,因此该值的指数不能为 0

要获取最小的正的非规格化值,请使用 std::numeric_limits ::denorm_min() ** 。 **denorm_min() 仅适用于浮点类型,对于整数类型,它返回0。

对于 整数类型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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程