Boost logo

Boost :

From: Dave Abrahams (abrahams_at_[hidden])
Date: 1999-12-11 12:57:50


> More on the multiplication-overflow topic.
>
> In case a example was needed for my addition rant, with a four-byte
> int, something as simple as the following won't work with the latest
> rational.hpp
>
> (rational(1, 100000) + rational(1, 100000)) == rational(1, 50000)
>
> as there is a temporary whose value is (100000 * 100000).
>
>
> I believe that *= and /= should change
>
> num *= r.num;
> den *= r.den;
>
> to
>
> Int gcd1 = gcd(num, r.den);
> Int gcd2 = gcd(r.num, den);
> num = (num / gcd1) * (r.num / gcd2);
> den = (den / gcd2) * (r.den / gcd1);
>
> for similar reasons, and an almost identical tricks helps op<
>
>
> On a related topic, I keep feeling that throwing an overflow
> exception might be necessary since, more so than integer and floating
> point types, rationals can overflow to nonsensical values in
> non-obvious situations. Then again, the cost might be prohibitive.
>
> Opinions?

Agreed on all counts, except that I'd like the overflow check to be optional
in non-debugging situations.


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