Package org.apfloat

Class Aprational

  • All Implemented Interfaces:
    java.io.Serializable, java.lang.Comparable<Apfloat>, java.util.Formattable
    Direct Known Subclasses:
    Apint

    public class Aprational
    extends Apfloat
    Arbitrary precision rational number class. An aprational consists of a numerator and a denominator of type Apint.

    Version:
    1.10.0
    See Also:
    Apint, AprationalMath, Serialized Form
    • Field Detail

      • numerator

        private Apint numerator
      • denominator

        private Apint denominator
      • scale

        private volatile long scale
      • size

        private volatile long size
      • inverseDen

        private transient java.lang.ref.SoftReference<Apfloat> inverseDen
      • approx

        private transient java.lang.ref.SoftReference<Apfloat> approx
    • Constructor Detail

      • Aprational

        protected Aprational()
        Default constructor. To be used only by subclasses that overload all needed methods.
      • Aprational

        public Aprational​(Apint numerator,
                          Apint denominator)
                   throws java.lang.IllegalArgumentException,
                          ApfloatRuntimeException
        Construct an aprational with the specified numerator and denominator.
        Parameters:
        numerator - The numerator.
        denominator - The denominator.
        Throws:
        java.lang.IllegalArgumentException - In case the denominator is zero, or if the denominator is not one or the numerator is not zero, and the radix of the numerator and denominator are different.
        ApfloatRuntimeException
      • Aprational

        public Aprational​(java.lang.String value)
                   throws java.lang.NumberFormatException,
                          java.lang.IllegalArgumentException,
                          ApfloatRuntimeException
        Constructs an aprational from a string. The default radix is used.

        The input must be of one of the formats

        integer
        numerator [whitespace] "/" [whitespace] denominator

        Parameters:
        value - The input string.
        Throws:
        java.lang.NumberFormatException - In case the number is invalid.
        java.lang.IllegalArgumentException - In case the denominator is zero.
        ApfloatRuntimeException
      • Aprational

        public Aprational​(java.lang.String value,
                          int radix)
                   throws java.lang.NumberFormatException,
                          java.lang.IllegalArgumentException,
                          ApfloatRuntimeException
        Constructs an aprational from a string with the specified radix.

        The input must be of one of the formats

        integer
        numerator [whitespace] "/" [whitespace] denominator

        Parameters:
        value - The input string.
        radix - The radix to be used.
        Throws:
        java.lang.NumberFormatException - In case the number is invalid.
        java.lang.IllegalArgumentException - In case the denominator is zero.
        ApfloatRuntimeException
      • Aprational

        public Aprational​(java.io.PushbackReader in)
                   throws java.io.IOException,
                          java.lang.NumberFormatException,
                          java.lang.IllegalArgumentException,
                          ApfloatRuntimeException
        Reads an aprational from a reader. The default radix is used. The constructor stops reading at the first character it doesn't understand. The reader must thus be a PushbackReader so that the invalid character can be returned back to the stream.

        The input must be of one of the formats

        integer [whitespace]
        numerator [whitespace] "/" [whitespace] denominator

        Parameters:
        in - The input stream.
        Throws:
        java.io.IOException - In case of I/O error reading the stream.
        java.lang.NumberFormatException - In case the number is invalid.
        java.lang.IllegalArgumentException - In case the denominator is zero.
        ApfloatRuntimeException
      • Aprational

        public Aprational​(java.io.PushbackReader in,
                          int radix)
                   throws java.io.IOException,
                          java.lang.NumberFormatException,
                          java.lang.IllegalArgumentException,
                          ApfloatRuntimeException
        Reads an aprational from a reader. The specified radix is used.
        Parameters:
        in - The input stream.
        radix - The radix to be used.
        Throws:
        java.io.IOException - In case of I/O error reading the stream.
        java.lang.NumberFormatException - In case the number is invalid.
        java.lang.IllegalArgumentException - In case the denominator is zero.
        ApfloatRuntimeException
        See Also:
        Aprational(PushbackReader)
      • Aprational

        public Aprational​(java.math.BigInteger value)
                   throws ApfloatRuntimeException
        Constructs an aprational from a BigInteger. The default radix is used.
        Parameters:
        value - The numerator of the number.
        Throws:
        ApfloatRuntimeException
      • Aprational

        public Aprational​(java.math.BigInteger value,
                          int radix)
                   throws ApfloatRuntimeException
        Constructs an aprational from a BigInteger using the specified radix.
        Parameters:
        value - The numerator of the number.
        radix - The radix of the number.
        Throws:
        ApfloatRuntimeException
      • Aprational

        public Aprational​(double value)
                   throws ApfloatRuntimeException
        Constructs an aprational from a double. The exact value represented by the double is used. The default radix is used.

        Note that doubles are presented as an integer multiplied by a power of two (positive or negative). Many numbers can't be represented exactly this way, e.g. new Aprational(0.1) won't result in 1/10 but in 3602879701896397/36028797018963968.

        Parameters:
        value - The numerator of the number.
        Throws:
        ApfloatRuntimeException
      • Aprational

        public Aprational​(double value,
                          int radix)
                   throws ApfloatRuntimeException
        Constructs an aprational from a double using the specified radix. The exact value represented by the double is used.

        Note that doubles are presented as an integer multiplied by a power of two (positive or negative). Many numbers can't be represented exactly this way, e.g. new Aprational(0.1) won't result in 1/10 but in 3602879701896397/36028797018963968.

        Parameters:
        value - The numerator of the number.
        radix - The radix of the number.
        Throws:
        ApfloatRuntimeException
    • Method Detail

      • numerator

        public Apint numerator()
        Numerator of this aprational.
        Returns:
        n where this = n / m.
      • denominator

        public Apint denominator()
        Denominator of this aprational.
        Returns:
        m where this = n / m.
      • radix

        public int radix()
        Radix of this aprational.
        Overrides:
        radix in class Apfloat
        Returns:
        Radix of this aprational.
      • scale

        public long scale()
                   throws ApfloatRuntimeException
        Returns the scale of this aprational. Scale is equal to the number of digits in the aprational's truncated value.

        Zero has a scale of -INFINITE.

        Overrides:
        scale in class Apfloat
        Returns:
        Number of digits in the truncated value of this aprational in the radix in which it's presented.
        Throws:
        ApfloatRuntimeException
        See Also:
        Apfloat.scale()
      • size

        public long size()
                  throws ApfloatRuntimeException
        Returns the size of this aprational. Size is equal to the number of significant digits in the aprational's floating-point expansion. If the expansion is infinite then this method returns INFINITE.

        Zero has a size of 0.

        Overrides:
        size in class Apfloat
        Returns:
        Number of significant digits in the floating-point expansion of this aprational in the radix in which it's presented.
        Throws:
        ApfloatRuntimeException
        Since:
        1.6
        See Also:
        Apfloat.size()
      • signum

        public int signum()
        Returns the signum function of this aprational.
        Overrides:
        signum in class Apfloat
        Returns:
        -1, 0 or 1 as the value of this aprational is negative, zero or positive.
      • isInteger

        public boolean isInteger()
                          throws ApfloatRuntimeException
        Returns if this number has an integer value. Note that this does not necessarily mean that this object is an instance of Apint.

        A rational number is an integer if the denominator is one.

        Overrides:
        isInteger in class Apfloat
        Returns:
        If this number's value is an integer.
        Throws:
        ApfloatRuntimeException
        Since:
        1.9.0
      • mod

        public Aprational mod​(Aprational x)
                       throws ApfloatRuntimeException
        Calculates the remainder when divided by an aprational. The result has the same sign as this number. If x is zero, then zero is returned.
        Parameters:
        x - The number that is used as the divisor in the remainder calculation.
        Returns:
        this % x.
        Throws:
        ApfloatRuntimeException
        Since:
        1.2
      • floor

        public Apint floor()
                    throws ApfloatRuntimeException
        Floor function. Returns the largest (closest to positive infinity) value that is not greater than this aprational and is equal to a mathematical integer.
        Overrides:
        floor in class Apfloat
        Returns:
        This aprational rounded towards negative infinity.
        Throws:
        ApfloatRuntimeException
      • ceil

        public Apint ceil()
                   throws ApfloatRuntimeException
        Ceiling function. Returns the smallest (closest to negative infinity) value that is not less than this aprational and is equal to a mathematical integer.
        Overrides:
        ceil in class Apfloat
        Returns:
        This aprational rounded towards positive infinity.
        Throws:
        ApfloatRuntimeException
      • frac

        public Aprational frac()
                        throws ApfloatRuntimeException
        Returns the fractional part. The fractional part is always 0 <= abs(x.frac()) < 1. The fractional part has the same sign as the number. For the fractional and integer parts, this always holds:

        x = x.truncate() + x.frac()

        Overrides:
        frac in class Apfloat
        Returns:
        The fractional part of this aprational.
        Throws:
        ApfloatRuntimeException
        Since:
        1.7.0
      • toRadix

        public Aprational toRadix​(int radix)
                           throws java.lang.NumberFormatException,
                                  ApfloatRuntimeException
        Convert this aprational to the specified radix.
        Overrides:
        toRadix in class Apfloat
        Parameters:
        radix - The radix.
        Returns:
        This number in the specified radix.
        Throws:
        java.lang.NumberFormatException - If the radix is invalid.
        ApfloatRuntimeException
        Since:
        1.2
      • compareTo

        public int compareTo​(Aprational x)
        Compare this aprational to the specified aprational.

        Parameters:
        x - Aprational to which this aprational is to be compared.
        Returns:
        -1, 0 or 1 as this aprational is numerically less than, equal to, or greater than x.
      • compareTo

        public int compareTo​(Apfloat x)
        Compare this aprational to the specified apfloat.

        Specified by:
        compareTo in interface java.lang.Comparable<Apfloat>
        Overrides:
        compareTo in class Apfloat
        Parameters:
        x - Apfloat to which this aprational is to be compared.
        Returns:
        -1, 0 or 1 as this aprational is numerically less than, equal to, or greater than x.
      • preferCompare

        public boolean preferCompare​(Apfloat x)
        Description copied from class: Apfloat
        Tests if the comparison with equals and compareTo should be done in the opposite order.

        Implementations should avoid infinite recursion.

        Overrides:
        preferCompare in class Apfloat
        Parameters:
        x - The number to compare to.
        Returns:
        true if this object should invoke x.equals(this) and -x.compareTo(this) instead of comparing normally.
      • equals

        public boolean equals​(java.lang.Object obj)
        Compares this object to the specified object.

        Note: if two apfloats are compared where one number doesn't have enough precise digits, the mantissa is assumed to contain zeros. See Apfloat.compareTo(Apfloat).

        Overrides:
        equals in class Apfloat
        Parameters:
        obj - The object to compare with.
        Returns:
        true if the objects are the same; false otherwise.
      • test

        public boolean test​(Aprational x)
        Tests two aprational numbers for equality. Returns false if the numbers are definitely known to be not equal. If true is returned, equality is unknown and should be verified by calling equals(Object). This method is usually significantly faster than calling equals(Object).
        Parameters:
        x - The number to test against.
        Returns:
        false if the numbers are definitely not equal, true if unknown.
        Since:
        1.10.0
      • test

        public boolean test​(Apfloat x)
                     throws ApfloatRuntimeException
        Description copied from class: Apfloat
        Tests two apfloat numbers for equality. Returns false if the numbers are definitely known to be not equal. If true is returned, equality is unknown and should be verified by calling Apfloat.equals(Object). This method is usually significantly faster than calling equals(Object).
        Overrides:
        test in class Apfloat
        Parameters:
        x - The number to test against.
        Returns:
        false if the numbers are definitely not equal, true if unknown.
        Throws:
        ApfloatRuntimeException
      • hashCode

        public int hashCode()
        Returns a hash code for this aprational.
        Overrides:
        hashCode in class Apfloat
        Returns:
        The hash code value for this object.
      • toString

        public java.lang.String toString()
        Returns a string representation of this aprational.
        Overrides:
        toString in class Apcomplex
        Returns:
        A string representing this object.
      • toString

        public java.lang.String toString​(boolean pretty)
                                  throws ApfloatRuntimeException
        Returns a string representation of this aprational.
        Overrides:
        toString in class Apfloat
        Parameters:
        pretty - true to use a fixed-point notation, false to use an exponential notation.
        Returns:
        A string representing this object.
        Throws:
        ApfloatRuntimeException
      • writeTo

        public void writeTo​(java.io.Writer out)
                     throws java.io.IOException,
                            ApfloatRuntimeException
        Write a string representation of this aprational to a Writer.
        Overrides:
        writeTo in class Apcomplex
        Parameters:
        out - The output Writer.
        Throws:
        java.io.IOException - In case of I/O error writing to the stream.
        ApfloatRuntimeException
      • writeTo

        public void writeTo​(java.io.Writer out,
                            boolean pretty)
                     throws java.io.IOException,
                            ApfloatRuntimeException
        Write a string representation of this aprational to a Writer.
        Overrides:
        writeTo in class Apfloat
        Parameters:
        out - The output Writer.
        pretty - true to use a fixed-point notation, false to use an exponential notation.
        Throws:
        java.io.IOException - In case of I/O error writing to the stream.
        ApfloatRuntimeException
      • formatTo

        public void formatTo​(java.util.Formatter formatter,
                             int flags,
                             int width,
                             int precision)
        Formats the object using the provided formatter.
        Specified by:
        formatTo in interface java.util.Formattable
        Overrides:
        formatTo in class Apfloat
        Parameters:
        formatter - The formatter.
        flags - The flags to modify the output format.
        width - The minimum number of characters to be written to the output, or -1 for no minimum.
        precision - The maximum number of characters to be written to the output, or -1 for no maximum.
        Since:
        1.3
        See Also:
        Apfloat.formatTo(Formatter,int,int,int)
      • getImpl

        protected ApfloatImpl getImpl​(long precision)
                               throws ApfloatRuntimeException
        Returns an ApfloatImpl representing the approximation of this aprational up to the requested precision.

        Overrides:
        getImpl in class Apfloat
        Parameters:
        precision - Precision of the ApfloatImpl that is needed.
        Returns:
        An ApfloatImpl representing this object to the requested precision.
        Throws:
        ApfloatRuntimeException
      • checkDenominator

        private void checkDenominator()
                               throws java.lang.IllegalArgumentException
        Throws:
        java.lang.IllegalArgumentException
      • getApprox

        private Apfloat getApprox​(long precision)
      • setApprox

        private void setApprox​(Apfloat approx)
      • getInverseDen

        private Apfloat getInverseDen()
      • setInverseDen

        private void setInverseDen​(Apfloat inverseDen)