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 4304d1e  NUMBERS-91: Fixes to BigFraction related Formatting classes
4304d1e is described below

commit 4304d1e0d195b086e19edcc7f963c097d87ce3f6
Author: Eric Barnhill <ericbarnh...@protonmail.ch>
AuthorDate: Fri Jan 18 14:44:32 2019 -0800

    NUMBERS-91: Fixes to BigFraction related Formatting classes
---
 .../commons/numbers/fraction/BigFraction.java      | 25 ++++++++++++++++++++++
 .../numbers/fraction/BigFractionFormat.java        |  8 +++----
 .../numbers/fraction/ProperBigFractionFormat.java  |  4 ++--
 3 files changed, 31 insertions(+), 6 deletions(-)

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 3cecc73..8c1d51d 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
@@ -116,6 +116,31 @@ public class BigFraction
     /**
      * Create a fraction given the double value.
      * <p>
+     * This factory method behaves <em>differently</em> from
+     * {@link #from(double, double, int)}. It converts the double value
+     * exactly, considering its internal bits representation. This works for 
all
+     * values except NaN and infinities and does not requires any loop or
+     * convergence threshold.
+     * </p>
+     * <p>
+     * Since this conversion is exact and since double numbers are sometimes
+     * approximated, the fraction created may seem strange in some cases. For 
example,
+     * calling <code>new BigFraction(1.0 / 3.0)</code> does <em>not</em> create
+     * the fraction 1/3, but the fraction 6004799503160661 / 18014398509481984
+     * because the double number passed to the constructor is not exactly 1/3
+     * (this number cannot be stored exactly in IEEE754).
+     * </p>
+     * @see #BigFraction(double, double, int)
+     * @param value the double value to convert to a fraction.
+     * @exception IllegalArgumentException if value is NaN or infinite
+     */
+    public static BigFraction from(final double value) throws 
IllegalArgumentException {
+       return new BigFraction(value);
+    }
+    
+    /**
+     * Create a fraction given the double value.
+     * <p>
      * This constructor behaves <em>differently</em> from
      * {@link #BigFraction(double, double, int)}. It converts the double value
      * exactly, considering its internal bits representation. This works for 
all
diff --git 
a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFractionFormat.java
 
b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFractionFormat.java
index 822e6a2..ac302c2 100644
--- 
a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFractionFormat.java
+++ 
b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFractionFormat.java
@@ -163,9 +163,9 @@ public class BigFractionFormat extends AbstractFormat 
implements Serializable {
         if (obj instanceof BigFraction) {
             ret = format((BigFraction) obj, toAppendTo, pos);
         } else if (obj instanceof BigInteger) {
-            ret = format(new BigFraction((BigInteger) obj), toAppendTo, pos);
+            ret = format(BigFraction.of((BigInteger) obj), toAppendTo, pos);
         } else if (obj instanceof Number) {
-            ret = format(new BigFraction(((Number) obj).doubleValue()),
+            ret = format(BigFraction.from(((Number) obj).doubleValue()),
                          toAppendTo, pos);
         } else {
             throw new IllegalArgumentException("cannot format given object as 
a fraction number");
@@ -222,7 +222,7 @@ public class BigFractionFormat extends AbstractFormat 
implements Serializable {
         case 0 :
             // no '/'
             // return num as a BigFraction
-            return new BigFraction(num);
+            return BigFraction.of(num);
         case '/' :
             // found '/', continue parsing denominator
             break;
@@ -248,7 +248,7 @@ public class BigFractionFormat extends AbstractFormat 
implements Serializable {
             return null;
         }
 
-        return new BigFraction(num, den);
+        return BigFraction.of(num, den);
     }
 
     /**
diff --git 
a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/ProperBigFractionFormat.java
 
b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/ProperBigFractionFormat.java
index 7460d0e..655e6d7 100644
--- 
a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/ProperBigFractionFormat.java
+++ 
b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/ProperBigFractionFormat.java
@@ -174,7 +174,7 @@ public class ProperBigFractionFormat extends 
BigFractionFormat {
         case 0 :
             // no '/'
             // return num as a BigFraction
-            return new BigFraction(num);
+            return BigFraction.of(num);
         case '/' :
             // found '/', continue parsing denominator
             break;
@@ -215,7 +215,7 @@ public class ProperBigFractionFormat extends 
BigFractionFormat {
             num = num.negate();
         }
 
-        return new BigFraction(num, den);
+        return BigFraction.of(num, den);
 
     }
 

Reply via email to