This is an automated email from the ASF dual-hosted git repository.
ericbarnhill pushed a commit to branch fraction-dev
in repository https://gitbox.apache.org/repos/asf/commons-numbers.git
The following commit(s) were added to refs/heads/fraction-dev by this push:
new fb71f89 NUMBERS-75: Fraction passes all FractionTests after updating
fb71f89 is described below
commit fb71f89470600abab9bb427783d67353f076e7e1
Author: Eric Barnhill <[email protected]>
AuthorDate: Thu Dec 27 11:59:28 2018 -0800
NUMBERS-75: Fraction passes all FractionTests after updating
FractionTest methods to factory methods.
---
.../apache/commons/numbers/fraction/Fraction.java | 17 ++++++++------
.../commons/numbers/fraction/FractionTest.java | 26 +++++++++++-----------
2 files changed, 23 insertions(+), 20 deletions(-)
diff --git
a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/Fraction.java
b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/Fraction.java
index baf15b7..012e950 100644
---
a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/Fraction.java
+++
b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/Fraction.java
@@ -478,13 +478,16 @@ public class Fraction
return this;
}
// t = u(v'/gcd) +/- v(u'/gcd)
- int gcd = ArithmeticUtils.gcd(denominator, fraction.denominator);
- int uvp = ArithmeticUtils.mulAndCheck(numerator, fraction.denominator
/ gcd);
- int upv = ArithmeticUtils.mulAndCheck(fraction.numerator, denominator
/ gcd);
- return new Fraction
- (isAdd ? ArithmeticUtils.addAndCheck(uvp, upv) :
- ArithmeticUtils.subAndCheck(uvp, upv),
- ArithmeticUtils.mulAndCheck(denominator, fraction.denominator));
+ int d1 = ArithmeticUtils.gcd(denominator, fraction.denominator);
+ int uvp = ArithmeticUtils.mulAndCheck(numerator, fraction.denominator
/ d1);
+ int upv = ArithmeticUtils.mulAndCheck(fraction.numerator, denominator
/ d1);
+ int t = isAdd ? ArithmeticUtils.addAndCheck(uvp, upv) :
ArithmeticUtils.subAndCheck(uvp, upv);
+ int tmodd1 = t % d1;
+ int d2 = (tmodd1==0)?d1:ArithmeticUtils.gcd(tmodd1, d1);
+ // result is (t/d2) / (u'/d1)(v'/d2)
+ int w = t / d2;
+ return new Fraction (w, ArithmeticUtils.mulAndCheck(denominator/d1,
+ fraction.denominator/d2));
}
/**
diff --git
a/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/FractionTest.java
b/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/FractionTest.java
index d689de0..e0cb2f2 100644
---
a/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/FractionTest.java
+++
b/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/FractionTest.java
@@ -162,9 +162,9 @@ public class FractionTest {
@Test
public void testCompareTo() {
- Fraction first = Fraction.ofDouble(1, 2);
- Fraction second = Fraction.ofDouble(1, 3);
- Fraction third = Fraction.ofDouble(1, 2);
+ Fraction first = Fraction.ofInt(1, 2);
+ Fraction second = Fraction.ofInt(1, 3);
+ Fraction third = Fraction.ofInt(1, 2);
Assert.assertEquals(0, first.compareTo(first));
Assert.assertEquals(0, first.compareTo(third));
@@ -174,8 +174,8 @@ public class FractionTest {
// these two values are different approximations of PI
// the first one is approximately PI - 3.07e-18
// the second one is approximately PI + 1.936e-17
- Fraction pi1 = Fraction.ofDouble(1068966896, 340262731);
- Fraction pi2 = Fraction.ofDouble( 411557987, 131002976);
+ Fraction pi1 = Fraction.ofInt(1068966896, 340262731);
+ Fraction pi2 = Fraction.ofInt( 411557987, 131002976);
Assert.assertEquals(-1, pi1.compareTo(pi2));
Assert.assertEquals( 1, pi2.compareTo(pi1));
Assert.assertEquals(0.0, pi1.doubleValue() - pi2.doubleValue(),
1.0e-20);
@@ -183,8 +183,8 @@ public class FractionTest {
@Test
public void testDoubleValue() {
- Fraction first = Fraction.ofDouble(1, 2);
- Fraction second = Fraction.ofDouble(1, 3);
+ Fraction first = Fraction.ofInt(1, 2);
+ Fraction second = Fraction.ofInt(1, 3);
Assert.assertEquals(0.5, first.doubleValue(), 0.0);
Assert.assertEquals(1.0 / 3.0, second.doubleValue(), 0.0);
@@ -192,8 +192,8 @@ public class FractionTest {
@Test
public void testFloatValue() {
- Fraction first = Fraction.ofDouble(1, 2);
- Fraction second = Fraction.ofDouble(1, 3);
+ Fraction first = Fraction.ofInt(1, 2);
+ Fraction second = Fraction.ofInt(1, 3);
Assert.assertEquals(0.5f, first.floatValue(), 0.0f);
Assert.assertEquals((float)(1.0 / 3.0), second.floatValue(), 0.0f);
@@ -201,8 +201,8 @@ public class FractionTest {
@Test
public void testIntValue() {
- Fraction first = Fraction.ofDouble(1, 2);
- Fraction second = Fraction.ofDouble(3, 2);
+ Fraction first = Fraction.ofInt(1, 2);
+ Fraction second = Fraction.ofInt(3, 2);
Assert.assertEquals(0, first.intValue());
Assert.assertEquals(1, second.intValue());
@@ -210,8 +210,8 @@ public class FractionTest {
@Test
public void testLongValue() {
- Fraction first = Fraction.ofDouble(1, 2);
- Fraction second = Fraction.ofDouble(3, 2);
+ Fraction first = Fraction.ofInt(1, 2);
+ Fraction second = Fraction.ofInt(3, 2);
Assert.assertEquals(0L, first.longValue());
Assert.assertEquals(1L, second.longValue());