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); }