【问题标题】:Why doesn't numeric_limits<T>::min() return the smallest value?为什么 numeric_limits<T>::min() 不返回最小值?
【发布时间】:2014-09-09 20:18:50
【问题描述】:

当我运行这段代码时:

#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

这怎么可能?

【问题讨论】:

标签: c++ numeric-limits


【解决方案1】:

历史原因。 std::numeric_limits 原建 围绕&lt;limits.h&gt; 的内容(例如, INT_MIN) 和&lt;float.h&gt;(你有例如DBL_MIN)。 这两个文件(我怀疑)是由不同的人设计的; 做浮点的人不需要单独的最积极的 和最负的值,因为最负的总是 否定最积极的,但他们确实需要知道 最小值大于 0。遗憾的是,这些值具有 名称的相同模式,std::numeric_limits 结束了 以不同方式定义min 的语义,具体取决于 std::numeric_limits&lt;&gt;::is_integer。

这使得模板编程更加尴尬,你不得不一直这样做 做std::numeric_limits&lt;T&gt;::is_integer ? std::numeric_limits&lt;T&gt;::min() : -std::numeric_limits&lt;T&gt;::max()之类的事情 所以 C++11 添加了std::numeric_limits&lt;&gt;::lowest(),它确实 完全符合您的预期。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 当然,这并不能解释为什么 std::numeric_limits&lt;&gt;::min() 的语义对于浮点和整数类型是不同的。
    • @JamesKanze:我喜欢你现在删除的答案,有机会取消删除吗?
    • @GManNickG 完成。我删除了它,因为它实际上并没有回答问题,我误解了它为什么不返回 -DBLMAX。另一方面,它确实解释了一些历史,以及为什么std::numeric_limits&lt;&gt;::min() 对于浮点和整数类型的行为如此不同。 (我认为这将是一个不同问题的好答案。)
    猜你喜欢
    • 2019-12-15
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多