|
Boost : |
From: Andrew D Jewell (ajewell_at_[hidden])
Date: 1999-12-11 11:59:29
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?
adj
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk