带有<T>浮点/双精度值的 std::numeric_limits::min() 的问题

Issue with std::numeric_limits<T>::min() with float/double values

本文关键字:numeric limits 问题 min gt lt 浮点 带有 双精度 std      更新时间:2023-10-16

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

使用-std::numeric_limits<double>::max();允许我获得真正的最小值,但您会期望std::numeric_limits<double>::min();返回该值。

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

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

在c++ 11中,std::numeric_limits::lowest对于实数和整型也是一致的。http://en.cppreference.com/w/cpp/types/numeric_limits/lowest

参见如何解决numeric_limits::min()定义不一致的问题?

为什么会这样?

这是因为std::numeric_limits<>::min()返回实现定义的FLT_MIN, DBL_MININT_MIN。在这方面,这种方法的行为是一致的。但是std::numeric_limits<double>::min(): DBL_MIN的返回值与INT_MIN的含义略有不同。这是double所能表示的最小值。可能存在大于0的值,但是double不能表示它

为什么在这个实例中使用min()不做同样的事情?

这背后的原理是,您可以查询<limits>的这个值,以检查特定于浮点运算的可能的下流。


可以使用

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

查询最小的负值