浮動 (またはその場合は固定) 小数点演算に 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> のオーバーフローを防ぐ正しい方法は何でしょうか?