【问题标题】:Issue with std::numeric_limits<T>::min() with float/double values带有浮点/双精度值的 std::numeric_limits<T>::min() 问题
【发布时间】:2014-03-28 07:23:36
【问题描述】:

在编写一些代码以确保用户输入有效时,我遇到了std::numeric_limits&lt;T&gt;::min(); 的问题,其中 T 是浮点类型,即双精度/浮点等。

使用-std::numeric_limits&lt;double&gt;::max(); 可以让我获得真正的最小值,但您会期望std::numeric_limits&lt;double&gt;::min(); 会返回该值。

为什么std::numeric_limits&lt;double&gt;::min(); 不返回这些类型的最小可能值,而是强制我们使用std::numeric_limits::lowest-std::numeric_limits&lt;double&gt;::max();

【问题讨论】:

  • 您正在将一个数字与该类型的最小值进行比较,以查看它是否小于该值。这没有意义,因为如果它小于最小值,则最小值必须是那个数字,然后它不再小于最小值。

标签: c++ c++11


【解决方案1】:

是的,使用-max() 将给出最低值。

在 C++11 中,std::numeric_limits::lowest 也适用于实数和整数。 http://en.cppreference.com/w/cpp/types/numeric_limits/lowest

另见How to workaround the inconsistent definition of numeric_limits<T>::min()?

【讨论】:

  • 谢谢,我收集了这么多。我仍然有兴趣知道为什么 ::min 在这种情况下不会返回您所期望的。有什么想法吗?
  • 我不知道确切的理由,但 C++ 遵循 FLT_MIN 的设置。我想这是一个最小浮动是一个无穷大而不是一个特定的有限数字的问题。
  • 我想这有点道理,但使用 min 我猜这个词似乎有点误导。
  • 我知道。被同样的问题所困扰。
【解决方案2】:

这是为什么?

这是因为std::numeric_limits&lt;&gt;::min() 返回定义的实现FLT_MINDBL_MININT_MIN。在这方面,这种方法的行为是一致的。但是std::numeric_limits&lt;double&gt;::min()的返回值:DBL_MININT_MIN的含义略有不同。这是double 可以表示的最小值。可能有大于 0 的值,但 double 不能表示。

为什么在这种情况下使用 min() 不能做同样的事情?

这背后的基本原理是,您可以查询 &lt;limits&gt; 以获取此值,以检查是否存在特定于浮点运算的可能下溢。


你可以使用

std::numeric_limits<double>::lowest()

查询最小的负值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2010-09-27
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    相关资源
    最近更新 更多