You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2017/03/19 17:45:18 UTC

[2/2] commons-numbers git commit: NUMBERS-15: Fix overflow in "BigFraction".

NUMBERS-15: Fix overflow in "BigFraction".

Thanks to Sergey Ushakov.


Project: http://git-wip-us.apache.org/repos/asf/commons-numbers/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-numbers/commit/b37c9f19
Tree: http://git-wip-us.apache.org/repos/asf/commons-numbers/tree/b37c9f19
Diff: http://git-wip-us.apache.org/repos/asf/commons-numbers/diff/b37c9f19

Branch: refs/heads/master
Commit: b37c9f195f28f897eadadaf1f2df86bca0b8ce7c
Parents: c15e3b9
Author: Gilles Sadowski <gi...@harfang.homelinux.org>
Authored: Sun Mar 19 18:43:49 2017 +0100
Committer: Gilles Sadowski <gi...@harfang.homelinux.org>
Committed: Sun Mar 19 18:43:49 2017 +0100

----------------------------------------------------------------------
 .../commons/numbers/fraction/BigFraction.java   | 16 ++++++++++----
 .../numbers/fraction/BigFractionTest.java       | 22 ++++++++++++++++++++
 src/changes/changes.xml                         |  5 +++--
 3 files changed, 37 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/b37c9f19/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
----------------------------------------------------------------------
diff --git a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
index eab9b7f..a76eb45 100644
--- a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
+++ b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
@@ -695,8 +695,12 @@ public class BigFraction
      */
     @Override
     public double doubleValue() {
-        double result = numerator.doubleValue() / denominator.doubleValue();
-        if (Double.isNaN(result)) {
+        double doubleNum = numerator.doubleValue();
+        double doubleDen = denominator.doubleValue();
+        double result = doubleNum / doubleDen;
+        if (Double.isInfinite(doubleNum) ||
+            Double.isInfinite(doubleDen) ||
+            Double.isNaN(result)) {
             // Numerator and/or denominator must be out of range:
             // Calculate how far to shift them to put them in range.
             int shift = Math.max(numerator.bitLength(),
@@ -748,8 +752,12 @@ public class BigFraction
      */
     @Override
     public float floatValue() {
-        float result = numerator.floatValue() / denominator.floatValue();
-        if (Double.isNaN(result)) {
+        float floatNum = numerator.floatValue();
+        float floatDen = denominator.floatValue();
+        float result = floatNum / floatDen;
+        if (Float.isInfinite(floatNum) ||
+            Float.isInfinite(floatDen) ||
+            Float.isNaN(result)) {
             // Numerator and/or denominator must be out of range:
             // Calculate how far to shift them to put them in range.
             int shift = Math.max(numerator.bitLength(),

http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/b37c9f19/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/BigFractionTest.java
----------------------------------------------------------------------
diff --git a/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/BigFractionTest.java b/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/BigFractionTest.java
index 55982ea..e17eb2a 100644
--- a/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/BigFractionTest.java
+++ b/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/BigFractionTest.java
@@ -233,6 +233,28 @@ public class BigFractionTest {
         Assert.assertEquals(5, large.floatValue(), 1e-15);
     }
 
+    // NUMBERS-15
+    @Test
+    public void testDoubleValueForLargeNumeratorAndSmallDenominator() {
+        final BigInteger pow300 = BigInteger.TEN.pow(300);
+        final BigInteger pow330 = BigInteger.TEN.pow(330);
+        final BigFraction large = new BigFraction(pow330.add(BigInteger.ONE),
+                                                  pow300);
+
+        Assert.assertEquals(1e30, large.doubleValue(), 1e-15);
+    }
+
+    // NUMBERS-15
+    @Test
+    public void testFloatValueForLargeNumeratorAndSmallDenominator() {
+        final BigInteger pow30 = BigInteger.TEN.pow(30);
+        final BigInteger pow40 = BigInteger.TEN.pow(40);
+        final BigFraction large = new BigFraction(pow40.add(BigInteger.ONE),
+                pow30);
+
+        Assert.assertEquals(1e10f, large.floatValue(), 1e-15);
+    }
+
     @Test
     public void testFloatValue() {
         BigFraction first = new BigFraction(1, 2);

http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/b37c9f19/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 941d628..06fdc65 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -56,8 +56,9 @@ This is the first release of Apache Commons Numbers.
 Apache Commons Numbers 1.0 contains the following modules:
 TBD
 ">
-      <!-- <action dev="erans" type="fix" issue="NUMBERS-xxx"> -->
-      <!-- </action> -->
+      <action dev="sushakov" type="fix" issue="NUMBERS-15">
+        "BigFraction": Fixed overflow "doubleValue()" and "floatValue()".
+      </action>
     </release>
 
   </body>