Class RationalNumber

  • All Implemented Interfaces:
    java.io.Serializable

    public class RationalNumber
    extends java.lang.Number
    Rational number, as used by the TIFF image format.

    The TIFF format specifies two data types for rational numbers based on a pair of 32-bit integers. Rational is based on unsigned 32-bit integers and SRational is based on signed 32-bit integers. This treatment is problematic in Java because Java does not support unsigned types. To address this challenge, this class stores the numerator and divisor in long (64-bit) integers, applying masks as necessary for the unsigned type.

    See Also:
    Serialized Form
    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      private static class  RationalNumber.Option  
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
        RationalNumber​(int numerator, int divisor)
      Constructs an instance based on signed integers
        RationalNumber​(int numerator, int divisor, boolean unsignedType)
      Constructs an instance supports either signed or unsigned integers.
      private RationalNumber​(long numerator, long divisor, boolean unsignedType)
      A private constructor for methods such as negate() that create instances of this class using the content of the current instance.
    • Field Detail

      • numerator

        public final long numerator
      • divisor

        public final long divisor
      • unsignedType

        public final boolean unsignedType
    • Constructor Detail

      • RationalNumber

        public RationalNumber​(int numerator,
                              int divisor)
        Constructs an instance based on signed integers
        Parameters:
        numerator - a 32-bit signed integer
        divisor - a non-zero 32-bit signed integer
      • RationalNumber

        public RationalNumber​(int numerator,
                              int divisor,
                              boolean unsignedType)
        Constructs an instance supports either signed or unsigned integers.
        Parameters:
        numerator - a numerator in the indicated form (signed or unsigned)
        divisor - a non-zero divisor in the indicated form (signed or unsigned)
        unsignedType - indicates whether the input values are to be treated as unsigned.
      • RationalNumber

        private RationalNumber​(long numerator,
                               long divisor,
                               boolean unsignedType)
        A private constructor for methods such as negate() that create instances of this class using the content of the current instance.
        Parameters:
        numerator - a valid numerator
        divisor - a valid denominator
        unsignedType - indicates how numerator and divisor values are to be interpreted.
    • Method Detail

      • factoryMethod

        static RationalNumber factoryMethod​(long n,
                                            long d)
      • gcd

        private static long gcd​(long a,
                                long b)
        Gets the greatest common divisor
      • valueOf

        public static RationalNumber valueOf​(double value)
        Calculate rational number using successive approximations.
        Parameters:
        value - rational number double value
        Returns:
        the RationalNumber representation of the double value
      • doubleValue

        public double doubleValue()
        Specified by:
        doubleValue in class java.lang.Number
      • floatValue

        public float floatValue()
        Specified by:
        floatValue in class java.lang.Number
      • intValue

        public int intValue()
        Specified by:
        intValue in class java.lang.Number
      • longValue

        public long longValue()
        Specified by:
        longValue in class java.lang.Number
      • negate

        public RationalNumber negate()
        Negates the value of the RationalNumber. If the numerator of this instance has its high-order bit set, then its value is too large to be treated as a Java 32-bit signed integer. In such a case, the only way that a RationalNumber instance can be negated is to divide both terms by a common divisor, if a non-zero common divisor exists. However, if no such divisor exists, there is no numerically correct way to perform the negation. When a negation cannot be performed correctly, this method throws an unchecked exception.
        Returns:
        a valid instance with a negated value.
      • toDisplayString

        public java.lang.String toDisplayString()
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object