带有<T>浮点/双精度值的 std::numeric_limits::min() 的问题
Issue with std::numeric_limits<T>::min() with float/double values
在编写一些代码以确保用户输入有效时,我遇到了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
为什么会这样?
这是因为std::numeric_limits<>::min()
返回实现定义的FLT_MIN
, DBL_MIN
或INT_MIN
。在这方面,这种方法的行为是一致的。但是std::numeric_limits<double>::min()
: DBL_MIN
的返回值与INT_MIN
的含义略有不同。这是double
所能表示的最小值。可能存在大于0的值,但是double不能表示它
为什么在这个实例中使用min()不做同样的事情?
这背后的原理是,您可以查询<limits>
的这个值,以检查特定于浮点运算的可能的下流。
可以使用
std::numeric_limits<double>::lowest()
查询最小的负值
- <limits> 使用 VSC2019 编译旧代码时出错
- 为什么在main()之前断言会导致语法错误"error: expected ')' before numeric constant"?
- limits.h中未确认的值
- OpenCV make error: limits.h 没有这样的目录文件
- boost::icl::interval 和 boost::numeric::interval 是否有可用的适配层?
- 在没有 <limits.h> 或 <values.h> 的系统上查找SHRT_MAX
- 检测<T>某些非数字类型 T 的 std::numeric::type 的特化
- 是否有内置函数可用于boost :: numeric ::间隔
- 使用 boost::numeric::odeint 积分非线性函数 f'(x, y, z) = a + b*I
- 模板实例化与Armadillo和Boost :: Numeric :: Odeint
- typedef 一个向量和 boost::numeric::ublas::vector 的固定大小
- 如何在没有 #include 的情况下获得DBL_MIN <limits> C++
- 为什么Boost Numeric库通过使用调试或发布模式给出不同的结果
- 从另一个子向量或subsatrix创建boost :: numeric :: ublas vector
- 包含 boost::numeric::ublas::matrix 的类的运算符重载
- GMOCK 叮当讨厌的错误"/usr/include/limits.h:123:16: fatal error: 'limits.h' file not found"
- Visual Studio malloc limits
- 当我<limits>在 c++ 代码中包含或<limit.h>时有什么区别
- 与CUDA/OpenMP兼容的`boost::numeric::odeint::runge_kutta-X`模板参数
- Limits of BOOST_FUSION_ADAPT_STRUCT