如何解决numeric_limits <T> :: min()的不一致定义?

12 c++ standard-library

numeric_limits特性应该是获得各种类型信息的一般方式,能够做到这样的事情

template<typename T>
T min(const std::vector<T>& vect)
{
    T val = std::numeric_limits<T>::min();

    for(int i=0 ; i<vect.size() ; i++)
        val = max(T, vect[i]);

    return val;
}
Run Code Online (Sandbox Code Playgroud)

问题是(至少使用MS Visual Studio 2008)numeric_limits <int> :: min()返回最小的负数,而numeric_limits <double> :: min()返回最小的数!

谁知道这个设计背后的理性呢?是否有更好的(推荐?)方式使用numeric_limits?在我上面的具体功能中,我当然可以将T初始化为vect [0],但这不是我要找的答案.

又见(浮点专用)的讨论 在这里

Căt*_*tiș 9

您可以使用Boost库.库Numeric Conversions提供了一个名为bounds的类,可以一致地使用它.

请参阅此处的文档.


Ale*_*erg 6

这是一个旧线程,但有一个更新的答案:

C++ 11添加了一个lowest()函数std::numeric_limits(见这里)

因此,您现在可以调用std::numeric_limits<double>::lowest()以获得最低可表示的负值.


sch*_*der 1

解决方法是

double val = -std::numeric_limits<double>::max();
Run Code Online (Sandbox Code Playgroud)

当然,这并不能解释 numerics_limits::min() 的奇怪行为,这可能是由于整数有不同的最小/最大边界(min = -2^n,max = 2^n- 1) 但不适用于双打。