commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "C. Scott Ananian" <csc...@cscott.net>
Subject Re: [lang] [math] org.apache.commons.lang.math.Fraction class
Date Sun, 30 May 2004 22:22:39 GMT
On Sun, 30 May 2004, Stephen Colebourne wrote:

> What about getNumerator()/getDenominator() - won't these change if 2/4 is
> held differently?

yes.

>                    I believe that we need to preserve the 2/4 concept
> distinct from 1/2, at least in the [lang] version.

I don't believe so.  I can't imagine any reason why we would not want
these to be indistinguishable.  It makes the operation of the entire class
more intuitive.  I'd be more inclined to agree with you if I heard from
some large user of this class where (for some reason) these concepts
wanted to remain separate.  I don't believe this user exists.

[And remember that fractions are reduced arbitrarily for some arithmetic
operations, so if you (for some reason) wanted a non-reduced fraction, it
would be hard to guarantee that it remained so.]

Most likely all users are just manually salting their code aggressively
with calls to f.reduce(), perhaps introducing some bugs by forgetting some
cases.  Making Fraction reduce all fractions by itself will fix these
user bugs.

> The [lang] code needs to work and be reliable. However I suspect that a
> [math] version and [lang] version may be appropriate with slightly different
> semantics.

I'd rather not encourage people to use a broken interface.  The current
Fraction has a number of actual bugs and encourages the programmer to make
others by its surprising behavior.  In my opinion, fixing the obvious bugs
in Fraction without fixing the surprising behavior would just
encourage people to use Fraction and so make the surprising behavior more
dangerous.

If Fraction is to be moved to math, I'd probably suggest deprecating
lang.Fraction with the following text, "This implementation of Fraction
is not robust and make produce suprising behavior in corner cases,
especially when large numerators or denominators are used (and because
fractions are not kept in reduced form, the numerator and denomiator will
tend to grow larger as arithmetic is performed). Users are strongly
encouraged to migrate to o.a.c.math.Fraction, which has an identical API
but maintains fractions in simplified form and works reliably with
numerators and denominators over the whole int range from
Integer.MIN_VALUE to Integer.MAX_VALUE."

If you're willing to change 'identical' to 'near-identical', I'd suggest
removing the 'reduce()' and 'getReducedFraction()' methods from Fraction
(instead of just deprecating them) when/if the class is moved.

It was a significant amount of work to fix all the corner cases in
Fraction.  At the moment I don't have time to repeat that work for a
non-reduced-Fraction 'minimal' patch.  You are welcome to do that
if you like.  Be careful of Integer.MIN_VALUE.  Keeping the updated test
cases is probably a good start, although you'll want to add new test cases
checking that unreduced fractions also behave reliably, especially in
regard to overflow.
 --scott

Ft. Meade Castro EZLN mail drop DNC Columbia IDEA Soviet  Albanian
Cheney terrorist Blair cracking domestic disruption Attache Mk 48
                         ( http://cscott.net/ )

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org


Mime
View raw message