为什么numeric_limits :: min为int返回负值但是为float / double返回正值?

时间:2013-06-12 16:11:25

标签: c++ std numeric-limits

为什么为numeric_limits :: min返回int的负值,但是为...漂浮和双倍?

#include<iostream>
#include<limits>

using namespace std;

int main() {
  cout << "int: " << numeric_limits<int>::min() << " "
       << "float: " << numeric_limits<float>::min() << " "
       << "double: " << numeric_limits<double>::min() << "\n";
  return 0;
}

输出:

int: -2147483648 float: 1.17549e-38 double: 2.22507e-308

来自cppreference:

  

返回数字类型T表示的最小有限值。

     

对于具有非规范化的浮点类型,min返回最小值   正标准化值。 请注意,此行为可能是意外的,   特别是与整数类型的min行为相比。至   找到没有小于它的值的值,使用   numeric_limits::lowest

     

min仅对有界类型有意义   对于无界无符号类型,即表示类型的类型   无限的负值集没有任何有意义的最小值。

2 个答案:

答案 0 :(得分:33)

根据定义,对于浮动类型,min返回类型可以编码的最小正值,而不是最低

如果您想要最低值,请改用numeric_limits::lowest

文档:http://en.cppreference.com/w/cpp/types/numeric_limits/min

至于为什么就是这样,我只能推测标准委员会需要有一种方法来表示所有不同原生类型的所有形式的极值。在积分类型的情况下,只有两种类型的极端:最大正数和最大负数。对于花车,还有另一种:最小可能。

如果您认为语义有点混乱,我同意。 C标准中相关#define的语义大致相同。

答案 1 :(得分:5)

这很不幸,但背后的名字却完全不同。它有点从C继承,其中DBL_MIN和INT_MIN具有完全相同的“问题”。

由于没有太多可以做,只记得什么意味着什么。