gpt4 book ai didi

c++ - boost::multiprecision::cpp_dec_float_50 溢出检查

转载 作者:行者123 更新时间:2023-11-30 04:14:43 32 4
gpt4 key购买 nike

我正在尝试使用 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<50> 溢出的正确方法是什么?

最佳答案

好的,我已经调试到库中,“错误”发生在这一行:

// Check if the operation is out of range, requiring special handling.
if(v.iszero() || (ofs_exp > max_delta_exp))
{
// Result is *this unchanged since v is negligible compared to *this.
return *this;
}

该类型的numeric_limit加1可以忽略不计,所以加法被舍弃。因此它不是 >=。

我的印象是该类型是作为固定点实现的(考虑到这个名字很愚蠢,我知道),但事实并非如此。这是来自boost doc

Operations involving cpp_dec_float are always truncating. However, note that since their are guard digits in effect, in practice this has no real impact on accuracy for most use cases.

真可惜,多精度库似乎没有固定的精度类型。

但是,为了检查 cpp_dec_float 中的溢出,可以这样做:

dtNew = _1 * _2;
if(dtNew.backend().isinf())
{
BOOST_THROW_EXCEPTION(OverUnderflow() << SpecificErrInfo(L"Attempted floating point over/underflow"));
}

关于c++ - boost::multiprecision::cpp_dec_float_50 溢出检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18727896/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com