Added add/subtract/multiply/divide functions with integer parameters to Fraction
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@760867 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
80419081ac
commit
3664a2cc7f
|
@ -31,11 +31,17 @@ import org.apache.commons.math.util.MathUtils;
|
|||
*/
|
||||
public class BigFraction extends Number implements Comparable<BigFraction> {
|
||||
|
||||
/** A fraction representing "2 / 1". */
|
||||
public static final BigFraction TWO = new BigFraction(2);
|
||||
|
||||
/** A fraction representing "1". */
|
||||
public static final BigFraction ONE = new BigFraction(1, 1);
|
||||
public static final BigFraction ONE = new BigFraction(1);
|
||||
|
||||
/** A fraction representing "0". */
|
||||
public static final BigFraction ZERO = new BigFraction(0, 1);
|
||||
public static final BigFraction ZERO = new BigFraction(0);
|
||||
|
||||
/** A fraction representing "-1 / 1". */
|
||||
public static final BigFraction MINUS_ONE = new BigFraction(-1);
|
||||
|
||||
/** A fraction representing "4/5". */
|
||||
public static final BigFraction FOUR_FIFTHS = new BigFraction(4, 5);
|
||||
|
@ -67,11 +73,8 @@ public class BigFraction extends Number implements Comparable<BigFraction> {
|
|||
/** A fraction representing "2/3". */
|
||||
public static final BigFraction TWO_THIRDS = new BigFraction(2, 3);
|
||||
|
||||
/** A fraction representing "-1 / 1". */
|
||||
public static final BigFraction MINUS_ONE = new BigFraction(-1, 1);
|
||||
|
||||
/** Serializable version identifier. */
|
||||
private static final long serialVersionUID = -5984892138972589598L;
|
||||
private static final long serialVersionUID = -130662482360701382L;
|
||||
|
||||
/** <code>BigInteger</code> representation of 100. */
|
||||
private static final BigInteger ONE_HUNDRED_DOUBLE = BigInteger.valueOf(100);
|
||||
|
|
|
@ -32,12 +32,42 @@ public class Fraction extends Number implements Comparable<Fraction> {
|
|||
/** A fraction representing "2 / 1". */
|
||||
public static final Fraction TWO = new Fraction(2, 1);
|
||||
|
||||
/** A fraction representing "1 / 1". */
|
||||
/** A fraction representing "1". */
|
||||
public static final Fraction ONE = new Fraction(1, 1);
|
||||
|
||||
/** A fraction representing "0 / 1". */
|
||||
/** A fraction representing "0". */
|
||||
public static final Fraction ZERO = new Fraction(0, 1);
|
||||
|
||||
/** A fraction representing "4/5". */
|
||||
public static final Fraction FOUR_FIFTHS = new Fraction(4, 5);
|
||||
|
||||
/** A fraction representing "1/5". */
|
||||
public static final Fraction ONE_FIFTH = new Fraction(1, 5);
|
||||
|
||||
/** A fraction representing "1/2". */
|
||||
public static final Fraction ONE_HALF = new Fraction(1, 2);
|
||||
|
||||
/** A fraction representing "1/4". */
|
||||
public static final Fraction ONE_QUARTER = new Fraction(1, 4);
|
||||
|
||||
/** A fraction representing "1/3". */
|
||||
public static final Fraction ONE_THIRD = new Fraction(1, 3);
|
||||
|
||||
/** A fraction representing "3/5". */
|
||||
public static final Fraction THREE_FIFTHS = new Fraction(3, 5);
|
||||
|
||||
/** A fraction representing "3/4". */
|
||||
public static final Fraction THREE_QUARTERS = new Fraction(3, 4);
|
||||
|
||||
/** A fraction representing "4/5". */
|
||||
public static final Fraction TWO_FIFTHS = new Fraction(4, 5);
|
||||
|
||||
/** A fraction representing "2/4". */
|
||||
public static final Fraction TWO_QUARTERS = new Fraction(2, 4);
|
||||
|
||||
/** A fraction representing "2/3". */
|
||||
public static final Fraction TWO_THIRDS = new Fraction(2, 3);
|
||||
|
||||
/** A fraction representing "-1 / 1". */
|
||||
public static final Fraction MINUS_ONE = new Fraction(-1, 1);
|
||||
|
||||
|
@ -198,6 +228,15 @@ public class Fraction extends Number implements Comparable<Fraction> {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a fraction from an int.
|
||||
* The fraction is num / 1.
|
||||
* @param num the numerator.
|
||||
*/
|
||||
public Fraction(int num) {
|
||||
this(num, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a fraction given the numerator and denominator. The fraction is
|
||||
* reduced to lowest terms.
|
||||
|
@ -206,7 +245,6 @@ public class Fraction extends Number implements Comparable<Fraction> {
|
|||
* @throws ArithmeticException if the denominator is <code>zero</code>
|
||||
*/
|
||||
public Fraction(int num, int den) {
|
||||
super();
|
||||
if (den == 0) {
|
||||
throw MathRuntimeException.createArithmeticException("zero denominator in fraction {0}/{1}",
|
||||
num, den);
|
||||
|
@ -220,7 +258,7 @@ public class Fraction extends Number implements Comparable<Fraction> {
|
|||
den = -den;
|
||||
}
|
||||
// reduce numerator and denominator by greatest common denominator.
|
||||
int d = MathUtils.gcd(num, den);
|
||||
final int d = MathUtils.gcd(num, den);
|
||||
if (d > 1) {
|
||||
num /= d;
|
||||
den /= d;
|
||||
|
@ -228,8 +266,8 @@ public class Fraction extends Number implements Comparable<Fraction> {
|
|||
|
||||
// move sign to numerator.
|
||||
if (den < 0) {
|
||||
num *= -1;
|
||||
den *= -1;
|
||||
num = -num;
|
||||
den = -den;
|
||||
}
|
||||
this.numerator = num;
|
||||
this.denominator = den;
|
||||
|
@ -387,6 +425,15 @@ public class Fraction extends Number implements Comparable<Fraction> {
|
|||
return addSub(fraction, true /* add */);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an integer to the fraction.
|
||||
* @param i the <tt>integer</tt> to add.
|
||||
* @return this + i
|
||||
*/
|
||||
public Fraction add(final int i) {
|
||||
return new Fraction(numerator + i * denominator, denominator);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Subtracts the value of another fraction from the value of this one,
|
||||
* returning the result in reduced form.</p>
|
||||
|
@ -401,6 +448,15 @@ public class Fraction extends Number implements Comparable<Fraction> {
|
|||
return addSub(fraction, false /* subtract */);
|
||||
}
|
||||
|
||||
/**
|
||||
* Subtract an integer from the fraction.
|
||||
* @param i the <tt>integer</tt> to subtract.
|
||||
* @return this - i
|
||||
*/
|
||||
public Fraction subtract(final int i) {
|
||||
return new Fraction(numerator - i * denominator, denominator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implement add and subtract using algorithm described in Knuth 4.5.1.
|
||||
*
|
||||
|
@ -484,6 +540,15 @@ public class Fraction extends Number implements Comparable<Fraction> {
|
|||
MathUtils.mulAndCheck(denominator/d2, fraction.denominator/d1));
|
||||
}
|
||||
|
||||
/**
|
||||
* Multiply the fraction by an integer.
|
||||
* @param i the <tt>integer</tt> to multiply by.
|
||||
* @return this * i
|
||||
*/
|
||||
public Fraction multiply(final int i) {
|
||||
return new Fraction(numerator * i, denominator);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Divide the value of this fraction by another.</p>
|
||||
*
|
||||
|
@ -506,6 +571,15 @@ public class Fraction extends Number implements Comparable<Fraction> {
|
|||
return multiply(fraction.reciprocal());
|
||||
}
|
||||
|
||||
/**
|
||||
* Divide the fraction by an integer.
|
||||
* @param i the <tt>integer</tt> to divide by.
|
||||
* @return this * i
|
||||
*/
|
||||
public Fraction divide(final int i) {
|
||||
return new Fraction(numerator, denominator * i);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Creates a <code>Fraction</code> instance with the 2 parts
|
||||
* of a fraction Y/Z.</p>
|
||||
|
@ -546,4 +620,5 @@ public class Fraction extends Number implements Comparable<Fraction> {
|
|||
denominator /= gcd;
|
||||
return new Fraction(numerator, denominator);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -39,6 +39,9 @@ The <action> type attribute can be add,update,fix,remove.
|
|||
</properties>
|
||||
<body>
|
||||
<release version="2.0" date="TBD" description="TBD">
|
||||
<action dev="luc" type="add">
|
||||
Added add/subtract/multiply/divide functions with integer parameters to Fraction
|
||||
</action>
|
||||
<action dev="luc" type="add">
|
||||
Added some utility functions to compute powers with integral types (int, long, BigInteger).
|
||||
</action>
|
||||
|
|
|
@ -308,6 +308,9 @@ public class FractionTest extends TestCase {
|
|||
Fraction f = f1.add(f2);
|
||||
assertEquals(Integer.MAX_VALUE, f.getNumerator());
|
||||
assertEquals(1, f.getDenominator());
|
||||
f = f1.add(1);
|
||||
assertEquals(Integer.MAX_VALUE, f.getNumerator());
|
||||
assertEquals(1, f.getDenominator());
|
||||
|
||||
f1 = new Fraction(-1, 13*13*2*2);
|
||||
f2 = new Fraction(-2, 13*17*2);
|
||||
|
@ -426,6 +429,12 @@ public class FractionTest extends TestCase {
|
|||
f = f1.divide(f1.reciprocal()); // should overflow
|
||||
fail("expecting ArithmeticException");
|
||||
} catch (ArithmeticException ex) {}
|
||||
|
||||
f1 = new Fraction(6, 35);
|
||||
f = f1.divide(15);
|
||||
assertEquals(2, f.getNumerator());
|
||||
assertEquals(175, f.getDenominator());
|
||||
|
||||
}
|
||||
|
||||
public void testMultiply() {
|
||||
|
@ -447,6 +456,11 @@ public class FractionTest extends TestCase {
|
|||
f.multiply(null);
|
||||
fail("expecting IllegalArgumentException");
|
||||
} catch (IllegalArgumentException ex) {}
|
||||
|
||||
f1 = new Fraction(6, 35);
|
||||
f = f1.multiply(15);
|
||||
assertEquals(18, f.getNumerator());
|
||||
assertEquals(7, f.getDenominator());
|
||||
}
|
||||
|
||||
public void testSubtract() {
|
||||
|
@ -483,6 +497,9 @@ public class FractionTest extends TestCase {
|
|||
f = f1.subtract(f2);
|
||||
assertEquals(Integer.MAX_VALUE-1, f.getNumerator());
|
||||
assertEquals(1, f.getDenominator());
|
||||
f = f1.subtract(1);
|
||||
assertEquals(Integer.MAX_VALUE-1, f.getNumerator());
|
||||
assertEquals(1, f.getDenominator());
|
||||
|
||||
try {
|
||||
f1 = new Fraction(1, Integer.MAX_VALUE);
|
||||
|
|
Loading…
Reference in New Issue