2013-06-12 46 views
27

为什么的numeric_limits :: min为int返回一个负值,但是例如为正值则为int。浮动和双重?为什么numeric_limits :: min为int返回负值,而float/double值为正值?

#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行为进行比较时。到 找到没有小于它的值的值,使用 numeric_limits::lowest

min仅对有界类型有意义,对于无界无符号类型则为 ,也就是说,表示无限值负值的 类型没有有意义的最小值。

+0

对于浮点值,min被定义为能够被该类型准确表示的最小*正数*数。 –

回答

30

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

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

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

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

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

+0

感谢您的推测。它是有道理的,需要有关最小可能类型的信息。我发现它真的很奇怪,它们都是为整数定义的,尽管它们返回相同的值。认为也许有更深层次的原因。 – gnzlbg

+4

@gnzlbg:我不知道certian,但我怀疑有什么更深的理由比简单的“这就是C做的。”。 –

+0

你确定那个“最小正值”? OP的输出对int来说看起来是负的,cppreference.com说“最小有限值”。我的编译器(仍然)不符合C++ 11,所以我不能使用最低:-( – craq

5

这是不幸的,但在类似的名字背后完全不同的含义在于。这是有点从C继承,其中DBL_MIN和INT_MIN具有相同的“问题”。

由于没有太多可以做的事情,只要记住是什么意思。

相关问题