Boost logo

Boost :

Subject: Re: [boost] [rational] Inadvertent construction from double
From: John Maddock (boost.regex_at_[hidden])
Date: 2014-07-25 11:13:38


> I have encountered something I consider a bug in boost::rational's
> interface. Its documentation discusses in detail why conversion from double
> is not supported, but the following code works fine:
>
> #include <iostream>
> #include <boost/rational.hpp>
>
> int main()
> {
> double d = 31.82;
> boost::rational<int> r = d;
> std::cout << r << std::endl;
> }
>
> With the following result:
> 31/1
> It just discards the fractional part. Such conversion is really confusing
> an I claim should be explicitly deleted.

It should indeed be prohibited and not proceed via an implicit
conversion. It's probably an easy fix via enable/disable_if as well.

Note that the Boost.Multiprecision rational classes *do* allow implicit
construction from floating point values since these are actually exact
conversions when correctly written (this is a new change in response to
a bug report - will be in the next release). So there's a discrepancy
there. However, rational<int> doesn't have enough bits to do such a
conversion correctly, so I guess it's maybe safer to forbid it in that case?

John.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk