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(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;
> 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.
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