1

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

4

1 に答える 1