$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] [review] Multiprecision review scheduled for June 8th - 17th, 2012
From: Christopher Kormanyos (e_float_at_[hidden])
Date: 2012-05-31 16:10:54
Thank you for your comments, Vicente.
>> I have spent some hours reading the documentation. Here are some comments and a lot of questions.
Did you get a chance to use it also? You always have such good comments,
that we would benefit from some your experience with use-cases.
>> * As all the classes are at the multi-precision namespace,
>> why name the main class mp_number and not just number?
>> typedef mp::number<mp::mpfr_float_backend<300> > my_float;
> Good question :)
> I don't have a particulary strong view whether it's "number" or
> "mp_number", but would like to know what others think.
I actually *do* have a slight preference for "mp_number",
with the *mp_* part. It simply reminds me that I'm actually doing
something with multiple precision type. An experienced booster once
told me that boost favors clarity over terseness. Perhaps this is
a case thereof.
>> * I think that the fact that operands of different backends can not
>> be mixed on the same operation limits some interesting operations:
I understand your comment, Vicente. In my experience,
the reduced error resulting from forbidding non-explicit mixing
of back-ends far outweighs potential benefits from allowing them.
Of course, this is only an opinion. Others will disagree.
When we discussed potential fixed-point types, you may
remember my recommendation.
I usually recommend:
* Do support seamless interaction with built-in types.
* Forbid implicit conversion of non-same specialized types.
* Potentially support explicit construction of one type from another.
Accordingly, we do support this:
boost::multiprecision::cpp_dec_float_100 a(boost::multiprecision::cpp_dec_float_100(123) / 100);
boost::multiprecision::cpp_dec_float_50 b(boost::multiprecision::cpp_dec_float_50(456) / 100);
boost::multiprecision::cpp_dec_float_50 c = boost::multiprecision::cpp_dec_float_50(a) * b;
But we do not support this:
boost::multiprecision::cpp_dec_float_100 a(boost::multiprecision::cpp_dec_float_100(123) / 100);
boost::multiprecision::cpp_dec_float_50 b(boost::multiprecision::cpp_dec_float_50(456) / 100);
boost::multiprecision::cpp_dec_float_50 c = a * b;
>> * What about replacing the second bool template parameter by an enum class expression_template {disabled, enabled}; which will be more explicit. That is
> Not a bad idea actually, I'd like to know what others think.
I like the suggestion.
>> * can we convert from a cpp_dec_float_100 to a cpp_dec_float_50?
>> if yes, which rounding policy is applied?
>> Do you plan to let the user configure the rounding policy?
> Yes you can convert, and the rounding is currently poorly defined :-(
> I'll let Chris answer about rounding policies, but basically it's a whole lot of work.
> The aim is not to try and compete with say MPFR, but be "good enough"
> for most purposes. For some suitable definition of "good enough" obviously ;-)
Yes, I confirm John's statement. You can explicitly convert.
Unfortunately, there simply is no support for rounding at
this time in the cpp_dec_float back-end.
To be quite honest, I do not have the time to work out a sensible
rounding scheme for the base-10 back-end in a reasonable time
schedule. One of the difficulties of base-10 is its unruly nature
regarding rounding.
I see the present review candidate of Boost.Multiprecision as a
good start on a long-term development with many potential
future improvements.
In particular, my long-term goal with a potential Boost.Multiprecision
is to create a greatly improved base-2 floating-point back-end in
the future. At that time, I would want to target vastly improved
performance, sensible allocation/deallocation, clear rounding semantics, etc.
One of the advantages of John's architecture is that mp_number
can be used with any back-end fulfilling the requirements.
So one could potentially phase out cpp_dec_float via deprecation
in the future and support a future cpp_bin_float.
>> If not, what about a mp_number_cast function taking as
>> parameter a rounding policy?
> I think it would be very hard to a coherant set of rounding policies
> that were applicable to all backends... including third party ones
> that haven't been thought of yet. Basically ducking that issue at present :-(
Yes, and keep ducking. We won't get it done correctly
in a reasonable time scale. In my opinion, we can consider in
association with an improved BPL base-2 floating-point
back-end in the future. Backwards compatibility could
be achieved with a potential rounding policy of *no rounding*.
MPFR, GMP, MPIR and the rest will get the rounding
that they have or don't have.
>> * Do you plan to add constexpr and noexcept to the interface?
>> After thinking a little bit I'm wondering if this is this possible
>> when using 3pp libraries backends that don't provide them?
> I'm also not sure if it's possible, or even what we would gain - I can't
> offhand think of any interfaces that could use constexp for example.
If you are aiming at compile-time constant mp_numbers, then
I do not believe it is possible with the specified low-complexity
constraints a constexpr functions and objects.
This works with state-of-the-art compilers today.
constexpr double pi = 3.14159265358979323846
But this may not work soon, or ever.
constexpr boost::multiprecision::cpp_dec_float_50 pi("3.14159265358979323846264338327950288419716939937510582097494");
>> * Why the "Non-member standard library function support"
>> can be used only with floating-point Backend types?
>> Why not with fixed-point types?
> Because we don't currently have any to test this with.
I performed some rudimentary tests with Boost.Multiprecision
and my own fixed-point type for microcontrollers. The
results were preliminarily positive and I do see potential here.
I am greatly looking forward to progress with fixed-point.
>> * How the performances of mp_number<this_trivial_adaptor<float>, false>
>> will compare with float?
> No idea, might be interesting to find out, will investigate.
I never tested it yet. It interests me as well for my research
in generic numeric programming.
Thank you for your detailed comments and suggestions.
Best regards, Chris.