为什么numeric_limits <t> :: min()不返回最小值?</t>

时间:2014-07-18 15:59:16

标签: c++ numeric-limits

当我运行此代码时:

#include <limits>
#include <cstdio>

#define T double

int main()
{
    static const T val = std::numeric_limits<T>::min();
    printf( "%g/2 = %g\n", val, val/2 );
}

我希望看到一个不可预测的结果。 但我得到了正确答案:

(16:53) > clang++ test_division.cpp -o test_division
(16:54) > ./test_division 
2.22507e-308/2 = 1.11254e-308

这怎么可能?

2 个答案:

答案 0 :(得分:12)

因为min为您提供了最小的规范化值。您仍然可以使用较小的非规范化值(请参阅http://en.wikipedia.org/wiki/Denormalized_number)。

答案 1 :(得分:7)

历史原因。 std::numeric_limits最初是建立的 围绕<limits.h>的内容(您可以在 INT_MIN)和<float.h>(例如DBL_MIN)。 这两个文件(我怀疑)是由不同的人设计的; 做浮点的人不需要单独的最积极的 而且最负面的价值,因为最负面的是永远的 否定最积极的,但他们确实需要知道 最小值大于0.遗憾的是,值具有 名称相同的模式,std::numeric_limits结束了 根据不同来定义min的语义 std::numeric_limits<>::is_integer

这使得模板编程更加尴尬,你不得不这样做 做std::numeric_limits<T>::is_integer ? std::numeric_limits<T>::min() : -std::numeric_limits<T>::max()之类的事情 所以C ++ 11添加std::numeric_limits<>::lowest(),确实如此 正是你所期待的。