【发布时间】:2013-09-10 20:09:12
【问题描述】:
我正在尝试将 boost::multiprecision 库用于浮点(或在这种情况下为定点)点算术。 但是,我无法通过以下方式检测潜在的溢出:
typedef boost::multiprecision::number<
boost::multiprecision::cpp_dec_float<50>
> flp_type;
typedef boost::multiprecision::number<
boost::multiprecision::cpp_dec_float<100>
> safe_flp_type;
flp_type _1 = std::numeric_limits<flp_type>::max();
flp_type _2("1");
flp_type _3 = std::numeric_limits<flp_type>::max();
flp_type dtNew;
// Here is the check
safe_flp_type _res = safe_flp_type(_1) + _2;
// **This condition is true for addition of _1 and _3,**
// but fails for _1 + _2
if( (_res > std::numeric_limits<flp_type>::max()) // overflow
||(_res < std::numeric_limits<flp_type>::min())) // underflow
{
BOOST_THROW_EXCEPTION(OverUnderflow() << SpecificErrInfo(L"Attempted floating point over/underflow"));
}
dtNew = _1 + _2;
不应该为触发异常的类型在 max() 中加 1 吗? 我也检查了溢出后的底层类型,不是cpp_dec_float_inf,还是cpp_dec_float_finite。 此外,dtNew 的值等于 std::numeric_limits::max()
我在这里是不是完全被概念误解了?如果是这样,防止 boost::multiprecision::cpp_dec_float 溢出的正确方法是什么?
【问题讨论】:
标签: c++ boost floating-point overflow numeric-limits