Boost logo

Boost Users :

Subject: Re: [Boost-users] [multiprecision] Empty intervals and intervalswithNaN check
From: Александров Петр (petr_aleksandrov_at_[hidden])
Date: 2013-11-21 16:35:27


21.11.2013 17:04, John Maddock пишет:
>> No, the class is a very thin wrapper around mpfi so there's
>> practically no error checking. I really should add some error checks
>> to the functions that create new intervals (i.e. assignment operators
>> from two "components"): I'll do that shortly.
>
> Here's the patch for better error checks going in Trunk, hopefully
> that should stop most invalid intervals from ever occurring in the
> first place:
>
> Index: mpfi.hpp
> ===================================================================
> --- mpfi.hpp (revision 86537)
> +++ mpfi.hpp (working copy)
> @@ -179,6 +179,8 @@
> }
> mpfi_float_imp& operator = (const char* s)
> {
> + using default_ops::eval_fpclassify;
> +
> if(m_data[0].left._mpfr_d == 0)
> mpfi_init2(m_data,
> multiprecision::detail::digits10_2_2(digits10 ? digits10 :
> get_default_precision()));
>
> @@ -203,7 +205,22 @@
> part.erase();
> b = part.c_str();
>
> - mpfi_interv_fr(m_data, a.data(), b.data());
> + if(eval_fpclassify(a) == FP_NAN)
> + {
> + mpfi_set_fr(this->data(), a.data());
> + }
> + else if(eval_fpclassify(b) == FP_NAN)
> + {
> + mpfi_set_fr(this->data(), b.data());
> + }
> + else
> + {
> + if(a.compare(b) > 0)
> + {
> + BOOST_THROW_EXCEPTION(std::runtime_error("Attempt to
> create interval with invalid range (start is greater than end)."));
> + }
> + mpfi_interv_fr(m_data, a.data(), b.data());
> + }
> }
> else if(mpfi_set_str(m_data, s, 10) != 0)
> {
> @@ -745,7 +762,23 @@
> template <unsigned D1, unsigned D2, mpfr_allocation_type AllocationType>
> inline void assign_components(mpfi_float_backend<D1>& result, const
> mpfr_float_backend<D2, AllocationType>& a, const
> mpfr_float_backend<D2, AllocationType>& b)
> {
> - mpfi_interv_fr(result.data(), a.data(), b.data());
> + using default_ops::eval_fpclassify;
> + if(eval_fpclassify(a) == FP_NAN)
> + {
> + mpfi_set_fr(result.data(), a.data());
> + }
> + else if(eval_fpclassify(b) == FP_NAN)
> + {
> + mpfi_set_fr(result.data(), b.data());
> + }
> + else
> + {
> + if(a.compare(b) > 0)
> + {
> + BOOST_THROW_EXCEPTION(std::runtime_error("Attempt to create
> interval with invalid range (start is greater than end)."));
> + }
> + mpfi_interv_fr(result.data(), a.data(), b.data());
> + }
> }
>
> template <unsigned Digits10, class V>
>
> John.
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>
>
Probably it will be better to allow a user to select: check empty
intervals and NaN (during creation and assignment too) or not.
Kind regards, Petr.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net