1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.commons.numbers.fraction; 18 19 import java.io.Serializable; 20 import java.math.BigDecimal; 21 import java.math.BigInteger; 22 import java.math.RoundingMode; 23 import java.util.Objects; 24 import org.apache.commons.numbers.core.NativeOperators; 25 26 /** 27 * Representation of a rational number using arbitrary precision. 28 * 29 * <p>The number is expressed as the quotient {@code p/q} of two {@link BigInteger}s, 30 * a numerator {@code p} and a non-zero denominator {@code q}. 31 * 32 * <p>This class is immutable. 33 * 34 * <a href="https://en.wikipedia.org/wiki/Rational_number">Rational number</a> 35 */ 36 public final class BigFraction 37 extends Number 38 implements Comparable<BigFraction>, 39 NativeOperators<BigFraction>, 40 Serializable { 41 /** A fraction representing "0". */ 42 public static final BigFraction ZERO = new BigFraction(BigInteger.ZERO); 43 44 /** A fraction representing "1". */ 45 public static final BigFraction ONE = new BigFraction(BigInteger.ONE); 46 47 /** Serializable version identifier. */ 48 private static final long serialVersionUID = 20190701L; 49 50 /** The default iterations used for convergence. */ 51 private static final int DEFAULT_MAX_ITERATIONS = 100; 52 53 /** Message for non-finite input double argument to factory constructors. */ 54 private static final String NOT_FINITE = "Not finite: "; 55 56 /** The overflow limit for conversion from a double (2^31). */ 57 private static final long OVERFLOW = 1L << 31; 58 59 /** The numerator of this fraction reduced to lowest terms. */ 60 private final BigInteger numerator; 61 62 /** The denominator of this fraction reduced to lowest terms. */ 63 private final BigInteger denominator; 64 65 /** 66 * Private constructor: Instances are created using factory methods. 67 * 68 * <p>This constructor should only be invoked when the fraction is known 69 * to be non-zero; otherwise use {@link #ZERO}. This avoids creating 70 * the zero representation {@code 0 / -1}. 71 * 72 * @param num Numerator, must not be {@code null}. 73 * @param den Denominator, must not be {@code null}. 74 * @throws ArithmeticException if the denominator is zero. 75 */ 76 private BigFraction(BigInteger num, BigInteger den) { 77 if (den.signum() == 0) { 78 throw new FractionException(FractionException.ERROR_ZERO_DENOMINATOR); 79 } 80 81 // reduce numerator and denominator by greatest common denominator 82 final BigInteger gcd = num.gcd(den); 83 if (BigInteger.ONE.compareTo(gcd) < 0) { 84 numerator = num.divide(gcd); 85 denominator = den.divide(gcd); 86 } else { 87 numerator = num; 88 denominator = den; 89 } 90 } 91 92 /** 93 * Private constructor: Instances are created using factory methods. 94 * 95 * <p>This sets the denominator to 1. 96 * 97 * @param num Numerator (must not be null). 98 */ 99 private BigFraction(BigInteger num) { 100 numerator = num; 101 denominator = BigInteger.ONE; 102 } 103 104 /** 105 * Create a fraction given the double value and either the maximum 106 * error allowed or the maximum number of denominator digits. 107 * 108 * <p> 109 * NOTE: This method is called with: 110 * </p> 111 * <ul> 112 * <li>EITHER a valid epsilon value and the maxDenominator set to 113 * Integer.MAX_VALUE (that way the maxDenominator has no effect) 114 * <li>OR a valid maxDenominator value and the epsilon value set to 115 * zero (that way epsilon only has effect if there is an exact 116 * match before the maxDenominator value is reached). 117 * </ul> 118 * <p> 119 * It has been done this way so that the same code can be reused for 120 * both scenarios. However this could be confusing to users if it 121 * were part of the public API and this method should therefore remain 122 * PRIVATE. 123 * </p> 124 * 125 * <p> 126 * See JIRA issue ticket MATH-181 for more details: 127 * https://issues.apache.org/jira/browse/MATH-181 128 * </p> 129 * 130 * @param value Value to convert to a fraction. 131 * @param epsilon Maximum error allowed. 132 * The resulting fraction is within {@code epsilon} of {@code value}, 133 * in absolute terms. 134 * @param maxDenominator Maximum denominator value allowed. 135 * @param maxIterations Maximum number of convergents. 136 * @return a new instance. 137 * @throws IllegalArgumentException if the given {@code value} is NaN or infinite. 138 * @throws ArithmeticException if the continued fraction failed to converge. 139 */ 140 private static BigFraction from(final double value, 141 final double epsilon, 142 final int maxDenominator, 143 final int maxIterations) { 144 if (!Double.isFinite(value)) { 145 throw new IllegalArgumentException(NOT_FINITE + value); 146 } 147 if (value == 0) { 148 return ZERO; 149 } 150 151 // Remove sign, this is restored at the end. 152 // (Assumes the value is not zero and thus signum(value) is not zero). 153 final double absValue = Math.abs(value); 154 double r0 = absValue; 155 long a0 = (long) Math.floor(r0); 156 if (a0 > OVERFLOW) { 157 throw new FractionException(FractionException.ERROR_CONVERSION_OVERFLOW, value, a0, 1); 158 } 159 160 // check for (almost) integer arguments, which should not go to iterations. 161 if (r0 - a0 <= epsilon) { 162 // Restore the sign. 163 if (value < 0) { 164 a0 = -a0; 165 } 166 return new BigFraction(BigInteger.valueOf(a0)); 167 } 168 169 // Support 2^31 as maximum denominator. 170 // This is negative as an integer so convert to long. 171 final long maxDen = Math.abs((long) maxDenominator); 172 173 long p0 = 1; 174 long q0 = 0; 175 long p1 = a0; 176 long q1 = 1; 177 178 long p2; 179 long q2; 180 181 int n = 0; 182 boolean stop = false; 183 do { 184 ++n; 185 final double r1 = 1.0 / (r0 - a0); 186 final long a1 = (long) Math.floor(r1); 187 p2 = (a1 * p1) + p0; 188 q2 = (a1 * q1) + q0; 189 if (Long.compareUnsigned(p2, OVERFLOW) > 0 || 190 Long.compareUnsigned(q2, OVERFLOW) > 0) { 191 // In maxDenominator mode, fall-back to the previous valid fraction. 192 if (epsilon == 0) { 193 p2 = p1; 194 q2 = q1; 195 break; 196 } 197 throw new FractionException(FractionException.ERROR_CONVERSION_OVERFLOW, value, p2, q2); 198 } 199 200 final double convergent = (double) p2 / (double) q2; 201 if (n < maxIterations && 202 Math.abs(convergent - absValue) > epsilon && 203 q2 < maxDen) { 204 p0 = p1; 205 p1 = p2; 206 q0 = q1; 207 q1 = q2; 208 a0 = a1; 209 r0 = r1; 210 } else { 211 stop = true; 212 } 213 } while (!stop); 214 215 if (n >= maxIterations) { 216 throw new FractionException(FractionException.ERROR_CONVERSION, value, maxIterations); 217 } 218 219 // Use p2 / q2 or p1 / q1 if q2 has grown too large in maxDenominator mode 220 long num; 221 long den; 222 if (q2 <= maxDen) { 223 num = p2; 224 den = q2; 225 } else { 226 num = p1; 227 den = q1; 228 } 229 230 // Restore the sign. 231 if (Math.signum(num) * Math.signum(den) != Math.signum(value)) { 232 num = -num; 233 } 234 235 return new BigFraction(BigInteger.valueOf(num), 236 BigInteger.valueOf(den)); 237 } 238 239 /** 240 * Create a fraction given the double value. 241 * <p> 242 * This factory method behaves <em>differently</em> to the method 243 * {@link #from(double, double, int)}. It converts the double value 244 * exactly, considering its internal bits representation. This works for all 245 * values except NaN and infinities and does not requires any loop or 246 * convergence threshold. 247 * </p> 248 * <p> 249 * Since this conversion is exact and since double numbers are sometimes 250 * approximated, the fraction created may seem strange in some cases. For example, 251 * calling {@code from(1.0 / 3.0)} does <em>not</em> create 252 * the fraction \( \frac{1}{3} \), but the fraction \( \frac{6004799503160661}{18014398509481984} \) 253 * because the double number passed to the method is not exactly \( \frac{1}{3} \) 254 * (which cannot be represented exactly in IEEE754). 255 * </p> 256 * 257 * @param value Value to convert to a fraction. 258 * @throws IllegalArgumentException if the given {@code value} is NaN or infinite. 259 * @return a new instance. 260 * 261 * @see #from(double,double,int) 262 */ 263 public static BigFraction from(final double value) { 264 if (!Double.isFinite(value)) { 265 throw new IllegalArgumentException(NOT_FINITE + value); 266 } 267 if (value == 0) { 268 return ZERO; 269 } 270 271 final long bits = Double.doubleToLongBits(value); 272 final long sign = bits & 0x8000000000000000L; 273 final long exponent = bits & 0x7ff0000000000000L; 274 final long mantissa = bits & 0x000fffffffffffffL; 275 276 // Compute m and k such that value = m * 2^k 277 long m; 278 int k; 279 280 if (exponent == 0) { 281 // Subnormal number, the effective exponent bias is 1022, not 1023. 282 // Note: mantissa is never zero as that case has been eliminated. 283 m = mantissa; 284 k = -1074; 285 } else { 286 // Normalized number: Add the implicit most significant bit. 287 m = mantissa | 0x0010000000000000L; 288 k = ((int) (exponent >> 52)) - 1075; // Exponent bias is 1023. 289 } 290 if (sign != 0) { 291 m = -m; 292 } 293 while ((m & 0x001ffffffffffffeL) != 0 && 294 (m & 0x1) == 0) { 295 m >>= 1; 296 ++k; 297 } 298 299 return k < 0 ? 300 new BigFraction(BigInteger.valueOf(m), 301 BigInteger.ZERO.flipBit(-k)) : 302 new BigFraction(BigInteger.valueOf(m).multiply(BigInteger.ZERO.flipBit(k)), 303 BigInteger.ONE); 304 } 305 306 /** 307 * Create a fraction given the double value and maximum error allowed. 308 * <p> 309 * References: 310 * <ul> 311 * <li><a href="http://mathworld.wolfram.com/ContinuedFraction.html"> 312 * Continued Fraction</a> equations (11) and (22)-(26)</li> 313 * </ul> 314 * 315 * @param value Value to convert to a fraction. 316 * @param epsilon Maximum error allowed. The resulting fraction is within 317 * {@code epsilon} of {@code value}, in absolute terms. 318 * @param maxIterations Maximum number of convergents. 319 * @throws IllegalArgumentException if the given {@code value} is NaN or infinite; 320 * {@code epsilon} is not positive; or {@code maxIterations < 1}. 321 * @throws ArithmeticException if the continued fraction failed to converge. 322 * @return a new instance. 323 */ 324 public static BigFraction from(final double value, 325 final double epsilon, 326 final int maxIterations) { 327 if (maxIterations < 1) { 328 throw new IllegalArgumentException("Max iterations must be strictly positive: " + maxIterations); 329 } 330 if (epsilon >= 0) { 331 return from(value, epsilon, Integer.MIN_VALUE, maxIterations); 332 } 333 throw new IllegalArgumentException("Epsilon must be positive: " + maxIterations); 334 } 335 336 /** 337 * Create a fraction given the double value and maximum denominator. 338 * 339 * <p> 340 * References: 341 * <ul> 342 * <li><a href="http://mathworld.wolfram.com/ContinuedFraction.html"> 343 * Continued Fraction</a> equations (11) and (22)-(26)</li> 344 * </ul> 345 * 346 * <p>Note: The magnitude of the {@code maxDenominator} is used allowing use of 347 * {@link Integer#MIN_VALUE} for a supported maximum denominator of 2<sup>31</sup>. 348 * 349 * @param value Value to convert to a fraction. 350 * @param maxDenominator Maximum allowed value for denominator. 351 * @throws IllegalArgumentException if the given {@code value} is NaN or infinite 352 * or {@code maxDenominator} is zero. 353 * @throws ArithmeticException if the continued fraction failed to converge. 354 * @return a new instance. 355 */ 356 public static BigFraction from(final double value, 357 final int maxDenominator) { 358 if (maxDenominator == 0) { 359 // Re-use the zero denominator message 360 throw new IllegalArgumentException(FractionException.ERROR_ZERO_DENOMINATOR); 361 } 362 return from(value, 0, maxDenominator, DEFAULT_MAX_ITERATIONS); 363 } 364 365 /** 366 * Create a fraction given the numerator. The denominator is {@code 1}. 367 * 368 * @param num 369 * the numerator. 370 * @return a new instance. 371 */ 372 public static BigFraction of(final int num) { 373 if (num == 0) { 374 return ZERO; 375 } 376 return new BigFraction(BigInteger.valueOf(num)); 377 } 378 379 /** 380 * Create a fraction given the numerator. The denominator is {@code 1}. 381 * 382 * @param num Numerator. 383 * @return a new instance. 384 */ 385 public static BigFraction of(final long num) { 386 if (num == 0) { 387 return ZERO; 388 } 389 return new BigFraction(BigInteger.valueOf(num)); 390 } 391 392 /** 393 * Create a fraction given the numerator. The denominator is {@code 1}. 394 * 395 * @param num Numerator. 396 * @return a new instance. 397 * @throws NullPointerException if numerator is null. 398 */ 399 public static BigFraction of(final BigInteger num) { 400 Objects.requireNonNull(num, "numerator"); 401 if (num.signum() == 0) { 402 return ZERO; 403 } 404 return new BigFraction(num); 405 } 406 407 /** 408 * Create a fraction given the numerator and denominator. 409 * The fraction is reduced to lowest terms. 410 * 411 * @param num Numerator. 412 * @param den Denominator. 413 * @return a new instance. 414 * @throws ArithmeticException if {@code den} is zero. 415 */ 416 public static BigFraction of(final int num, final int den) { 417 if (num == 0) { 418 return ZERO; 419 } 420 return new BigFraction(BigInteger.valueOf(num), BigInteger.valueOf(den)); 421 } 422 423 /** 424 * Create a fraction given the numerator and denominator. 425 * The fraction is reduced to lowest terms. 426 * 427 * @param num Numerator. 428 * @param den Denominator. 429 * @return a new instance. 430 * @throws ArithmeticException if {@code den} is zero. 431 */ 432 public static BigFraction of(final long num, final long den) { 433 if (num == 0) { 434 return ZERO; 435 } 436 return new BigFraction(BigInteger.valueOf(num), BigInteger.valueOf(den)); 437 } 438 439 /** 440 * Create a fraction given the numerator and denominator. 441 * The fraction is reduced to lowest terms. 442 * 443 * @param num Numerator. 444 * @param den Denominator. 445 * @return a new instance. 446 * @throws NullPointerException if numerator or denominator are null. 447 * @throws ArithmeticException if the denominator is zero. 448 */ 449 public static BigFraction of(final BigInteger num, final BigInteger den) { 450 if (num.signum() == 0) { 451 return ZERO; 452 } 453 return new BigFraction(num, den); 454 } 455 456 /** 457 * Returns a {@code BigFraction} instance representing the specified string {@code s}. 458 * 459 * <p>If {@code s} is {@code null}, then a {@code NullPointerException} is thrown. 460 * 461 * <p>The string must be in a format compatible with that produced by 462 * {@link #toString() BigFraction.toString()}. 463 * The format expects an integer optionally followed by a {@code '/'} character and 464 * and second integer. Leading and trailing spaces are allowed around each numeric part. 465 * Each numeric part is parsed using {@link BigInteger#BigInteger(String)}. The parts 466 * are interpreted as the numerator and optional denominator of the fraction. If absent 467 * the denominator is assumed to be "1". 468 * 469 * <p>Examples of valid strings and the equivalent {@code BigFraction} are shown below: 470 * 471 * <pre> 472 * "0" = BigFraction.of(0) 473 * "42" = BigFraction.of(42) 474 * "0 / 1" = BigFraction.of(0, 1) 475 * "1 / 3" = BigFraction.of(1, 3) 476 * "-4 / 13" = BigFraction.of(-4, 13)</pre> 477 * 478 * <p>Note: The fraction is returned in reduced form and the numerator and denominator 479 * may not match the values in the input string. For this reason the result of 480 * {@code BigFraction.parse(s).toString().equals(s)} may not be {@code true}. 481 * 482 * @param s String representation. 483 * @return an instance. 484 * @throws NullPointerException if the string is null. 485 * @throws NumberFormatException if the string does not contain a parsable fraction. 486 * @see BigInteger#BigInteger(String) 487 * @see #toString() 488 */ 489 public static BigFraction parse(String s) { 490 final String stripped = s.replace(",", ""); 491 final int slashLoc = stripped.indexOf('/'); 492 // if no slash, parse as single number 493 if (slashLoc == -1) { 494 return of(new BigInteger(stripped.trim())); 495 } 496 final BigInteger num = new BigInteger(stripped.substring(0, slashLoc).trim()); 497 final BigInteger denom = new BigInteger(stripped.substring(slashLoc + 1).trim()); 498 return of(num, denom); 499 } 500 501 @Override 502 public BigFraction zero() { 503 return ZERO; 504 } 505 506 /** {@inheritDoc} */ 507 @Override 508 public boolean isZero() { 509 return numerator.signum() == 0; 510 } 511 512 @Override 513 public BigFraction one() { 514 return ONE; 515 } 516 517 /** {@inheritDoc} */ 518 @Override 519 public boolean isOne() { 520 return numerator.equals(denominator); 521 } 522 523 /** 524 * Access the numerator as a {@code BigInteger}. 525 * 526 * @return the numerator as a {@code BigInteger}. 527 */ 528 public BigInteger getNumerator() { 529 return numerator; 530 } 531 532 /** 533 * Access the numerator as an {@code int}. 534 * 535 * @return the numerator as an {@code int}. 536 */ 537 public int getNumeratorAsInt() { 538 return numerator.intValue(); 539 } 540 541 /** 542 * Access the numerator as a {@code long}. 543 * 544 * @return the numerator as a {@code long}. 545 */ 546 public long getNumeratorAsLong() { 547 return numerator.longValue(); 548 } 549 550 /** 551 * Access the denominator as a {@code BigInteger}. 552 * 553 * @return the denominator as a {@code BigInteger}. 554 */ 555 public BigInteger getDenominator() { 556 return denominator; 557 } 558 559 /** 560 * Access the denominator as an {@code int}. 561 * 562 * @return the denominator as an {@code int}. 563 */ 564 public int getDenominatorAsInt() { 565 return denominator.intValue(); 566 } 567 568 /** 569 * Access the denominator as a {@code long}. 570 * 571 * @return the denominator as a {@code long}. 572 */ 573 public long getDenominatorAsLong() { 574 return denominator.longValue(); 575 } 576 577 /** 578 * Retrieves the sign of this fraction. 579 * 580 * @return -1 if the value is strictly negative, 1 if it is strictly 581 * positive, 0 if it is 0. 582 */ 583 public int signum() { 584 return numerator.signum() * denominator.signum(); 585 } 586 587 /** 588 * Returns the absolute value of this fraction. 589 * 590 * @return the absolute value. 591 */ 592 public BigFraction abs() { 593 return signum() >= 0 ? 594 this : 595 negate(); 596 } 597 598 @Override 599 public BigFraction negate() { 600 return new BigFraction(numerator.negate(), denominator); 601 } 602 603 /** 604 * {@inheritDoc} 605 * 606 * <p>Raises an exception if the fraction is equal to zero. 607 * 608 * @throws ArithmeticException if the current numerator is {@code zero} 609 */ 610 @Override 611 public BigFraction reciprocal() { 612 return new BigFraction(denominator, numerator); 613 } 614 615 /** 616 * Returns the {@code double} value closest to this fraction. 617 * 618 * @return the fraction as a {@code double}. 619 */ 620 @Override 621 public double doubleValue() { 622 return Double.longBitsToDouble(toFloatingPointBits(11, 52)); 623 } 624 625 /** 626 * Returns the {@code float} value closest to this fraction. 627 * 628 * @return the fraction as a {@code double}. 629 */ 630 @Override 631 public float floatValue() { 632 return Float.intBitsToFloat((int) toFloatingPointBits(8, 23)); 633 } 634 635 /** 636 * Returns the whole number part of the fraction. 637 * 638 * @return the largest {@code int} value that is not larger than this fraction. 639 */ 640 @Override 641 public int intValue() { 642 return numerator.divide(denominator).intValue(); 643 } 644 645 /** 646 * Returns the whole number part of the fraction. 647 * 648 * @return the largest {@code long} value that is not larger than this fraction. 649 */ 650 @Override 651 public long longValue() { 652 return numerator.divide(denominator).longValue(); 653 } 654 655 /** 656 * Returns the {@code BigDecimal} representation of this fraction. 657 * This calculates the fraction as numerator divided by denominator. 658 * 659 * @return the fraction as a {@code BigDecimal}. 660 * @throws ArithmeticException 661 * if the exact quotient does not have a terminating decimal 662 * expansion. 663 * @see BigDecimal 664 */ 665 public BigDecimal bigDecimalValue() { 666 return new BigDecimal(numerator).divide(new BigDecimal(denominator)); 667 } 668 669 /** 670 * Returns the {@code BigDecimal} representation of this fraction. 671 * This calculates the fraction as numerator divided by denominator 672 * following the passed rounding mode. 673 * 674 * @param roundingMode Rounding mode to apply. 675 * @return the fraction as a {@code BigDecimal}. 676 * @see BigDecimal 677 */ 678 public BigDecimal bigDecimalValue(RoundingMode roundingMode) { 679 return new BigDecimal(numerator).divide(new BigDecimal(denominator), roundingMode); 680 } 681 682 /** 683 * Returns the {@code BigDecimal} representation of this fraction. 684 * This calculates the fraction as numerator divided by denominator 685 * following the passed scale and rounding mode. 686 * 687 * @param scale 688 * scale of the {@code BigDecimal} quotient to be returned. 689 * see {@link BigDecimal} for more information. 690 * @param roundingMode Rounding mode to apply. 691 * @return the fraction as a {@code BigDecimal}. 692 * @throws ArithmeticException if {@code roundingMode} == {@link RoundingMode#UNNECESSARY} and 693 * the specified scale is insufficient to represent the result of the division exactly. 694 * @see BigDecimal 695 */ 696 public BigDecimal bigDecimalValue(final int scale, RoundingMode roundingMode) { 697 return new BigDecimal(numerator).divide(new BigDecimal(denominator), scale, roundingMode); 698 } 699 700 /** 701 * Adds the specified {@code value} to this fraction, returning 702 * the result in reduced form. 703 * 704 * @param value Value to add. 705 * @return {@code this + value}. 706 */ 707 public BigFraction add(final int value) { 708 return add(BigInteger.valueOf(value)); 709 } 710 711 /** 712 * Adds the specified {@code value} to this fraction, returning 713 * the result in reduced form. 714 * 715 * @param value Value to add. 716 * @return {@code this + value}. 717 */ 718 public BigFraction add(final long value) { 719 return add(BigInteger.valueOf(value)); 720 } 721 722 /** 723 * Adds the specified {@code value} to this fraction, returning 724 * the result in reduced form. 725 * 726 * @param value Value to add. 727 * @return {@code this + value}. 728 */ 729 public BigFraction add(final BigInteger value) { 730 if (value.signum() == 0) { 731 return this; 732 } 733 if (isZero()) { 734 return of(value); 735 } 736 737 return of(numerator.add(denominator.multiply(value)), denominator); 738 } 739 740 /** 741 * Adds the specified {@code value} to this fraction, returning 742 * the result in reduced form. 743 * 744 * @param value Value to add. 745 * @return {@code this + value}. 746 */ 747 @Override 748 public BigFraction add(final BigFraction value) { 749 if (value.isZero()) { 750 return this; 751 } 752 if (isZero()) { 753 return value; 754 } 755 756 final BigInteger num; 757 final BigInteger den; 758 759 if (denominator.equals(value.denominator)) { 760 num = numerator.add(value.numerator); 761 den = denominator; 762 } else { 763 num = (numerator.multiply(value.denominator)).add((value.numerator).multiply(denominator)); 764 den = denominator.multiply(value.denominator); 765 } 766 767 if (num.signum() == 0) { 768 return ZERO; 769 } 770 771 return new BigFraction(num, den); 772 } 773 774 /** 775 * Subtracts the specified {@code value} from this fraction, returning 776 * the result in reduced form. 777 * 778 * @param value Value to subtract. 779 * @return {@code this - value}. 780 */ 781 public BigFraction subtract(final int value) { 782 return subtract(BigInteger.valueOf(value)); 783 } 784 785 /** 786 * Subtracts the specified {@code value} from this fraction, returning 787 * the result in reduced form. 788 * 789 * @param value Value to subtract. 790 * @return {@code this - value}. 791 */ 792 public BigFraction subtract(final long value) { 793 return subtract(BigInteger.valueOf(value)); 794 } 795 796 /** 797 * Subtracts the specified {@code value} from this fraction, returning 798 * the result in reduced form. 799 * 800 * @param value Value to subtract. 801 * @return {@code this - value}. 802 */ 803 public BigFraction subtract(final BigInteger value) { 804 if (value.signum() == 0) { 805 return this; 806 } 807 if (isZero()) { 808 return of(value.negate()); 809 } 810 811 return of(numerator.subtract(denominator.multiply(value)), denominator); 812 } 813 814 /** 815 * Subtracts the specified {@code value} from this fraction, returning 816 * the result in reduced form. 817 * 818 * @param value Value to subtract. 819 * @return {@code this - value}. 820 */ 821 @Override 822 public BigFraction subtract(final BigFraction value) { 823 if (value.isZero()) { 824 return this; 825 } 826 if (isZero()) { 827 return value.negate(); 828 } 829 830 final BigInteger num; 831 final BigInteger den; 832 if (denominator.equals(value.denominator)) { 833 num = numerator.subtract(value.numerator); 834 den = denominator; 835 } else { 836 num = (numerator.multiply(value.denominator)).subtract((value.numerator).multiply(denominator)); 837 den = denominator.multiply(value.denominator); 838 } 839 840 if (num.signum() == 0) { 841 return ZERO; 842 } 843 844 return new BigFraction(num, den); 845 } 846 847 /** 848 * Multiply this fraction by the passed {@code value}, returning 849 * the result in reduced form. 850 * 851 * @param value Value to multiply by. 852 * @return {@code this * value}. 853 */ 854 @Override 855 public BigFraction multiply(final int value) { 856 if (value == 0 || isZero()) { 857 return ZERO; 858 } 859 860 return multiply(BigInteger.valueOf(value)); 861 } 862 863 /** 864 * Multiply this fraction by the passed {@code value}, returning 865 * the result in reduced form. 866 * 867 * @param value Value to multiply by. 868 * @return {@code this * value}. 869 */ 870 public BigFraction multiply(final long value) { 871 if (value == 0 || isZero()) { 872 return ZERO; 873 } 874 875 return multiply(BigInteger.valueOf(value)); 876 } 877 878 /** 879 * Multiply this fraction by the passed {@code value}, returning 880 * the result in reduced form. 881 * 882 * @param value Value to multiply by. 883 * @return {@code this * value}. 884 */ 885 public BigFraction multiply(final BigInteger value) { 886 if (value.signum() == 0 || isZero()) { 887 return ZERO; 888 } 889 return new BigFraction(value.multiply(numerator), denominator); 890 } 891 892 /** 893 * Multiply this fraction by the passed {@code value}, returning 894 * the result in reduced form. 895 * 896 * @param value Value to multiply by. 897 * @return {@code this * value}. 898 */ 899 @Override 900 public BigFraction multiply(final BigFraction value) { 901 if (value.isZero() || isZero()) { 902 return ZERO; 903 } 904 return new BigFraction(numerator.multiply(value.numerator), 905 denominator.multiply(value.denominator)); 906 } 907 908 /** 909 * Divide this fraction by the passed {@code value}, returning 910 * the result in reduced form. 911 * 912 * @param value Value to divide by 913 * @return {@code this / value}. 914 * @throws ArithmeticException if the value to divide by is zero 915 */ 916 public BigFraction divide(final int value) { 917 return divide(BigInteger.valueOf(value)); 918 } 919 920 /** 921 * Divide this fraction by the passed {@code value}, returning 922 * the result in reduced form. 923 * 924 * @param value Value to divide by 925 * @return {@code this / value}. 926 * @throws ArithmeticException if the value to divide by is zero 927 */ 928 public BigFraction divide(final long value) { 929 return divide(BigInteger.valueOf(value)); 930 } 931 932 /** 933 * Divide this fraction by the passed {@code value}, returning 934 * the result in reduced form. 935 * 936 * @param value Value to divide by 937 * @return {@code this / value}. 938 * @throws ArithmeticException if the value to divide by is zero 939 */ 940 public BigFraction divide(final BigInteger value) { 941 if (value.signum() == 0) { 942 throw new FractionException(FractionException.ERROR_DIVIDE_BY_ZERO); 943 } 944 if (isZero()) { 945 return ZERO; 946 } 947 return new BigFraction(numerator, denominator.multiply(value)); 948 } 949 950 /** 951 * Divide this fraction by the passed {@code value}, returning 952 * the result in reduced form. 953 * 954 * @param value Value to divide by 955 * @return {@code this / value}. 956 * @throws ArithmeticException if the value to divide by is zero 957 */ 958 @Override 959 public BigFraction divide(final BigFraction value) { 960 if (value.isZero()) { 961 throw new FractionException(FractionException.ERROR_DIVIDE_BY_ZERO); 962 } 963 if (isZero()) { 964 return ZERO; 965 } 966 // Multiply by reciprocal 967 return new BigFraction(numerator.multiply(value.denominator), 968 denominator.multiply(value.numerator)); 969 } 970 971 /** 972 * Returns a {@code BigFraction} whose value is 973 * <code>this<sup>exponent</sup></code>, returning the result in reduced form. 974 * 975 * @param exponent exponent to which this {@code BigFraction} is to be raised. 976 * @return <code>this<sup>exponent</sup></code>. 977 * @throws ArithmeticException if the intermediate result would overflow. 978 */ 979 @Override 980 public BigFraction pow(final int exponent) { 981 if (exponent == 1) { 982 return this; 983 } 984 if (exponent == 0) { 985 return ONE; 986 } 987 if (isZero()) { 988 if (exponent < 0) { 989 throw new FractionException(FractionException.ERROR_ZERO_DENOMINATOR); 990 } 991 return ZERO; 992 } 993 if (exponent > 0) { 994 return new BigFraction(numerator.pow(exponent), 995 denominator.pow(exponent)); 996 } 997 if (exponent == -1) { 998 return this.reciprocal(); 999 } 1000 if (exponent == Integer.MIN_VALUE) { 1001 // MIN_VALUE can't be negated 1002 return new BigFraction(denominator.pow(Integer.MAX_VALUE).multiply(denominator), 1003 numerator.pow(Integer.MAX_VALUE).multiply(numerator)); 1004 } 1005 // Note: Raise the BigIntegers to the power and then reduce. 1006 // The supported range for BigInteger is currently 1007 // +/-2^(Integer.MAX_VALUE) exclusive thus larger 1008 // exponents (long, BigInteger) are currently not supported. 1009 return new BigFraction(denominator.pow(-exponent), 1010 numerator.pow(-exponent)); 1011 } 1012 1013 /** 1014 * Returns the {@code String} representing this fraction. 1015 * Uses: 1016 * <ul> 1017 * <li>{@code "0"} if {@code numerator} is zero. 1018 * <li>{@code "numerator"} if {@code denominator} is one. 1019 * <li>{@code "numerator / denominator"} for all other cases. 1020 * </ul> 1021 * 1022 * @return a string representation of the fraction. 1023 */ 1024 @Override 1025 public String toString() { 1026 final String str; 1027 if (isZero()) { 1028 str = "0"; 1029 } else if (BigInteger.ONE.equals(denominator)) { 1030 str = numerator.toString(); 1031 } else { 1032 str = numerator + " / " + denominator; 1033 } 1034 return str; 1035 } 1036 1037 /** 1038 * Compares this object with the specified object for order using the signed magnitude. 1039 * 1040 * @param other {@inheritDoc} 1041 * @return {@inheritDoc} 1042 */ 1043 @Override 1044 public int compareTo(final BigFraction other) { 1045 final int lhsSigNum = signum(); 1046 final int rhsSigNum = other.signum(); 1047 1048 if (lhsSigNum != rhsSigNum) { 1049 return (lhsSigNum > rhsSigNum) ? 1 : -1; 1050 } 1051 // Same sign. 1052 // Avoid a multiply if both fractions are zero 1053 if (lhsSigNum == 0) { 1054 return 0; 1055 } 1056 // Compare absolute magnitude 1057 final BigInteger nOd = numerator.abs().multiply(other.denominator.abs()); 1058 final BigInteger dOn = denominator.abs().multiply(other.numerator.abs()); 1059 return nOd.compareTo(dOn); 1060 } 1061 1062 /** 1063 * Test for equality with another object. If the other object is a {@code Fraction} then a 1064 * comparison is made of the sign and magnitude; otherwise {@code false} is returned. 1065 * 1066 * @param other {@inheritDoc} 1067 * @return {@inheritDoc} 1068 */ 1069 @Override 1070 public boolean equals(final Object other) { 1071 if (this == other) { 1072 return true; 1073 } 1074 1075 if (other instanceof BigFraction) { 1076 // Since fractions are always in lowest terms, numerators and 1077 // denominators can be compared directly for equality. 1078 final BigFraction rhs = (BigFraction) other; 1079 if (signum() == rhs.signum()) { 1080 return numerator.abs().equals(rhs.numerator.abs()) && 1081 denominator.abs().equals(rhs.denominator.abs()); 1082 } 1083 } 1084 1085 return false; 1086 } 1087 1088 @Override 1089 public int hashCode() { 1090 // Incorporate the sign and absolute values of the numerator and denominator. 1091 // Equivalent to: 1092 // int hash = 1; 1093 // hash = 31 * hash + numerator.abs().hashCode(); 1094 // hash = 31 * hash + denominator.abs().hashCode(); 1095 // hash = hash * signum() 1096 // Note: BigInteger.hashCode() * BigInteger.signum() == BigInteger.abs().hashCode(). 1097 final int numS = numerator.signum(); 1098 final int denS = denominator.signum(); 1099 return (31 * (31 + numerator.hashCode() * numS) + denominator.hashCode() * denS) * numS * denS; 1100 } 1101 1102 /** 1103 * Calculates the sign bit, the biased exponent and the significand for a 1104 * binary floating-point representation of this {@code BigFraction} 1105 * according to the IEEE 754 standard, and encodes these values into a {@code long} 1106 * variable. The representative bits are arranged adjacent to each other and 1107 * placed at the low-order end of the returned {@code long} value, with the 1108 * least significant bits used for the significand, the next more 1109 * significant bits for the exponent, and next more significant bit for the 1110 * sign. 1111 * 1112 * <p>Warning: The arguments are not validated. 1113 * 1114 * @param exponentLength the number of bits allowed for the exponent; must be 1115 * between 1 and 32 (inclusive), and must not be greater 1116 * than {@code 63 - significandLength} 1117 * @param significandLength the number of bits allowed for the significand 1118 * (excluding the implicit leading 1-bit in 1119 * normalized numbers, e.g. 52 for a double-precision 1120 * floating-point number); must be between 1 and 1121 * {@code 63 - exponentLength} (inclusive) 1122 * @return the bits of an IEEE 754 binary floating-point representation of 1123 * this fraction encoded in a {@code long}, as described above. 1124 */ 1125 private long toFloatingPointBits(int exponentLength, int significandLength) { 1126 // Assume the following conditions: 1127 //assert exponentLength >= 1; 1128 //assert exponentLength <= 32; 1129 //assert significandLength >= 1; 1130 //assert significandLength <= 63 - exponentLength; 1131 1132 if (isZero()) { 1133 return 0L; 1134 } 1135 1136 final long sign = (numerator.signum() * denominator.signum()) == -1 ? 1L : 0L; 1137 final BigInteger positiveNumerator = numerator.abs(); 1138 final BigInteger positiveDenominator = denominator.abs(); 1139 1140 /* 1141 * The most significant 1-bit of a non-zero number is not explicitly 1142 * stored in the significand of an IEEE 754 normalized binary 1143 * floating-point number, so we need to round the value of this fraction 1144 * to (significandLength + 1) bits. In order to do this, we calculate 1145 * the most significant (significandLength + 2) bits, and then, based on 1146 * the least significant of those bits, find out whether we need to 1147 * round up or down. 1148 * 1149 * First, we'll remove all powers of 2 from the denominator because they 1150 * are not relevant for the significand of the prospective binary 1151 * floating-point value. 1152 */ 1153 final int denRightShift = positiveDenominator.getLowestSetBit(); 1154 final BigInteger divisor = positiveDenominator.shiftRight(denRightShift); 1155 1156 /* 1157 * Now, we're going to calculate the (significandLength + 2) most 1158 * significant bits of the fraction's value using integer division. To 1159 * guarantee that the quotient of the division has at least 1160 * (significandLength + 2) bits, the bit length of the dividend must 1161 * exceed that of the divisor by at least that amount. 1162 * 1163 * If the denominator has prime factors other than 2, i.e. if the 1164 * divisor was not reduced to 1, an excess of exactly 1165 * (significandLength + 2) bits is sufficient, because the knowledge 1166 * that the fractional part of the precise quotient's binary 1167 * representation does not terminate is enough information to resolve 1168 * cases where the most significant (significandLength + 2) bits alone 1169 * are not conclusive. 1170 * 1171 * Otherwise, the quotient must be calculated exactly and the bit length 1172 * of the numerator can only be reduced as long as no precision is lost 1173 * in the process (meaning it can have powers of 2 removed, like the 1174 * denominator). 1175 */ 1176 int numRightShift = positiveNumerator.bitLength() - divisor.bitLength() - (significandLength + 2); 1177 if (numRightShift > 0 && 1178 divisor.equals(BigInteger.ONE)) { 1179 numRightShift = Math.min(numRightShift, positiveNumerator.getLowestSetBit()); 1180 } 1181 final BigInteger dividend = positiveNumerator.shiftRight(numRightShift); 1182 1183 final BigInteger quotient = dividend.divide(divisor); 1184 1185 int quotRightShift = quotient.bitLength() - (significandLength + 1); 1186 long significand = roundAndRightShift( 1187 quotient, 1188 quotRightShift, 1189 !divisor.equals(BigInteger.ONE) 1190 ).longValue(); 1191 1192 /* 1193 * If the significand had to be rounded up, this could have caused the 1194 * bit length of the significand to increase by one. 1195 */ 1196 if ((significand & (1L << (significandLength + 1))) != 0) { 1197 significand >>= 1; 1198 quotRightShift++; 1199 } 1200 1201 /* 1202 * Now comes the exponent. The absolute value of this fraction based on 1203 * the current local variables is: 1204 * 1205 * significand * 2^(numRightShift - denRightShift + quotRightShift) 1206 * 1207 * To get the unbiased exponent for the floating-point value, we need to 1208 * add (significandLength) to the above exponent, because all but the 1209 * most significant bit of the significand will be treated as a 1210 * fractional part. To convert the unbiased exponent to a biased 1211 * exponent, we also need to add the exponent bias. 1212 */ 1213 final int exponentBias = (1 << (exponentLength - 1)) - 1; 1214 long exponent = (long) numRightShift - denRightShift + quotRightShift + significandLength + exponentBias; 1215 final long maxExponent = (1L << exponentLength) - 1L; //special exponent for infinities and NaN 1216 1217 if (exponent >= maxExponent) { //infinity 1218 exponent = maxExponent; 1219 significand = 0L; 1220 } else if (exponent > 0) { //normalized number 1221 significand &= -1L >>> (64 - significandLength); //remove implicit leading 1-bit 1222 } else { //smaller than the smallest normalized number 1223 /* 1224 * We need to round the quotient to fewer than 1225 * (significandLength + 1) bits. This must be done with the original 1226 * quotient and not with the current significand, because the loss 1227 * of precision in the previous rounding might cause a rounding of 1228 * the current significand's value to produce a different result 1229 * than a rounding of the original quotient. 1230 * 1231 * So we find out how many high-order bits from the quotient we can 1232 * transfer into the significand. The absolute value of the fraction 1233 * is: 1234 * 1235 * quotient * 2^(numRightShift - denRightShift) 1236 * 1237 * To get the significand, we need to right shift the quotient so 1238 * that the above exponent becomes (1 - exponentBias - significandLength) 1239 * (the unbiased exponent of a subnormal floating-point number is 1240 * defined as equivalent to the minimum unbiased exponent of a 1241 * normalized floating-point number, and (- significandLength) 1242 * because the significand will be treated as the fractional part). 1243 */ 1244 significand = roundAndRightShift(quotient, 1245 (1 - exponentBias - significandLength) - (numRightShift - denRightShift), 1246 !divisor.equals(BigInteger.ONE)).longValue(); 1247 exponent = 0L; 1248 1249 /* 1250 * Note: It is possible that an otherwise subnormal number will 1251 * round up to the smallest normal number. However, this special 1252 * case does not need to be treated separately, because the 1253 * overflowing highest-order bit of the significand will then simply 1254 * become the lowest-order bit of the exponent, increasing the 1255 * exponent from 0 to 1 and thus establishing the implicity of the 1256 * leading 1-bit. 1257 */ 1258 } 1259 1260 return (sign << (significandLength + exponentLength)) | 1261 (exponent << significandLength) | 1262 significand; 1263 } 1264 1265 /** 1266 * Rounds an integer to the specified power of two (i.e. the minimum number of 1267 * low-order bits that must be zero) and performs a right-shift by this 1268 * amount. The rounding mode applied is round to nearest, with ties rounding 1269 * to even (meaning the prospective least significant bit must be zero). The 1270 * number can optionally be treated as though it contained at 1271 * least one 0-bit and one 1-bit in its fractional part, to influence the result in cases 1272 * that would otherwise be a tie. 1273 * @param value the number to round and right-shift 1274 * @param bits the power of two to which to round; must be positive 1275 * @param hasFractionalBits whether the number should be treated as though 1276 * it contained a non-zero fractional part 1277 * @return a {@code BigInteger} as described above 1278 */ 1279 private static BigInteger roundAndRightShift(BigInteger value, int bits, boolean hasFractionalBits) { 1280 // Assumptions: 1281 // assert bits > 0 1282 1283 BigInteger result = value.shiftRight(bits); 1284 if (value.testBit(bits - 1) && 1285 (hasFractionalBits || 1286 value.getLowestSetBit() < bits - 1 || 1287 value.testBit(bits))) { 1288 result = result.add(BigInteger.ONE); //round up 1289 } 1290 1291 return result; 1292 } 1293 }