From d7c0f27e9fac104f613dcb672c243d3dc7eaf655 Mon Sep 17 00:00:00 2001 From: Thomas Neidhart Date: Wed, 1 Aug 2012 21:24:27 +0000 Subject: [PATCH] [MATH-836] Improve overflow check for negative values in Fraction constructor. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1368253 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/math3/fraction/Fraction.java | 4 ++-- .../java/org/apache/commons/math3/fraction/FractionTest.java | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/math3/fraction/Fraction.java b/src/main/java/org/apache/commons/math3/fraction/Fraction.java index f81ff0a94..08d3b9556 100644 --- a/src/main/java/org/apache/commons/math3/fraction/Fraction.java +++ b/src/main/java/org/apache/commons/math3/fraction/Fraction.java @@ -178,7 +178,7 @@ public class Fraction long overflow = Integer.MAX_VALUE; double r0 = value; long a0 = (long)FastMath.floor(r0); - if (a0 > overflow) { + if (FastMath.abs(a0) > overflow) { throw new FractionConversionException(value, a0, 1l); } @@ -206,7 +206,7 @@ public class Fraction long a1 = (long)FastMath.floor(r1); p2 = (a1 * p1) + p0; q2 = (a1 * q1) + q0; - if ((p2 > overflow) || (q2 > overflow)) { + if ((FastMath.abs(p2) > overflow) || (FastMath.abs(q2) > overflow)) { throw new FractionConversionException(value, p2, q2); } diff --git a/src/test/java/org/apache/commons/math3/fraction/FractionTest.java b/src/test/java/org/apache/commons/math3/fraction/FractionTest.java index c112ab752..37e22d105 100644 --- a/src/test/java/org/apache/commons/math3/fraction/FractionTest.java +++ b/src/test/java/org/apache/commons/math3/fraction/FractionTest.java @@ -60,6 +60,7 @@ public class FractionTest { } catch (MathArithmeticException ex) { // success } + assertFraction(0, 1, new Fraction(0.00000000000001)); assertFraction(2, 5, new Fraction(0.40000000000001)); assertFraction(15, 1, new Fraction(15.0000000000001)); @@ -134,6 +135,8 @@ public class FractionTest { public void testIntegerOverflow() { checkIntegerOverflow(0.75000000001455192); checkIntegerOverflow(1.0e10); + checkIntegerOverflow(-1.0e10); + checkIntegerOverflow(-43979.60679604749); } private void checkIntegerOverflow(double a) {