Class DfpField

  • All Implemented Interfaces:
    Field<Dfp>

    public class DfpField
    extends Object
    implements Field<Dfp>
    Field for Decimal floating point instances.
    Since:
    2.2
    • Constructor Detail

      • DfpField

        public DfpField​(int decimalDigits)
        Create a factory for the specified number of radix digits.

        Note that since the Dfp class uses 10000 as its radix, each radix digit is equivalent to 4 decimal digits. This implies that asking for 13, 14, 15 or 16 decimal digits will really lead to a 4 radix 10000 digits in all cases.

        Parameters:
        decimalDigits - minimal number of decimal digits.
    • Method Detail

      • getRadixDigits

        public int getRadixDigits()
        Get the number of radix digits of the Dfp instances built by this factory.
        Returns:
        number of radix digits
      • newDfp

        public Dfp newDfp()
        Makes a Dfp with a value of 0.
        Returns:
        a new Dfp with a value of 0
      • newDfp

        public Dfp newDfp​(byte x)
        Create an instance from a byte value.
        Parameters:
        x - value to convert to an instance
        Returns:
        a new Dfp with the same value as x
      • newDfp

        public Dfp newDfp​(int x)
        Create an instance from an int value.
        Parameters:
        x - value to convert to an instance
        Returns:
        a new Dfp with the same value as x
      • newDfp

        public Dfp newDfp​(long x)
        Create an instance from a long value.
        Parameters:
        x - value to convert to an instance
        Returns:
        a new Dfp with the same value as x
      • newDfp

        public Dfp newDfp​(double x)
        Create an instance from a double value.
        Parameters:
        x - value to convert to an instance
        Returns:
        a new Dfp with the same value as x
      • newDfp

        public Dfp newDfp​(Dfp d)
        Copy constructor.
        Parameters:
        d - instance to copy
        Returns:
        a new Dfp with the same value as d
      • newDfp

        public Dfp newDfp​(String s)
        Create a Dfp given a String representation.
        Parameters:
        s - string representation of the instance
        Returns:
        a new Dfp parsed from specified string
      • newDfp

        public Dfp newDfp​(byte sign,
                          byte nans)
        Creates a Dfp with a non-finite value.
        Parameters:
        sign - sign of the Dfp to create
        nans - code of the value, must be one of Dfp.INFINITE, Dfp.SNAN, Dfp.QNAN
        Returns:
        a new Dfp with a non-finite value
      • getTwo

        public Dfp getTwo()
        Get the constant 2.
        Returns:
        a Dfp with value 2
      • getSqr2

        public Dfp getSqr2()
        Get the constant √2.
        Returns:
        a Dfp with value √2
      • getSqr2Split

        public Dfp[] getSqr2Split()
        Get the constant √2 split in two pieces.
        Returns:
        a Dfp with value √2 split in two pieces
      • getSqr3

        public Dfp getSqr3()
        Get the constant √3.
        Returns:
        a Dfp with value √3
      • getPi

        public Dfp getPi()
        Get the constant π.
        Returns:
        a Dfp with value π
      • getPiSplit

        public Dfp[] getPiSplit()
        Get the constant π split in two pieces.
        Returns:
        a Dfp with value π split in two pieces
      • getE

        public Dfp getE()
        Get the constant e.
        Returns:
        a Dfp with value e
      • getESplit

        public Dfp[] getESplit()
        Get the constant e split in two pieces.
        Returns:
        a Dfp with value e split in two pieces
      • getLn2

        public Dfp getLn2()
        Get the constant ln(2).
        Returns:
        a Dfp with value ln(2)
      • getLn2Split

        public Dfp[] getLn2Split()
        Get the constant ln(2) split in two pieces.
        Returns:
        a Dfp with value ln(2) split in two pieces
      • getLn5

        public Dfp getLn5()
        Get the constant ln(5).
        Returns:
        a Dfp with value ln(5)
      • getLn5Split

        public Dfp[] getLn5Split()
        Get the constant ln(5) split in two pieces.
        Returns:
        a Dfp with value ln(5) split in two pieces
      • getLn10

        public Dfp getLn10()
        Get the constant ln(10).
        Returns:
        a Dfp with value ln(10)
      • computeExp

        public static Dfp computeExp​(Dfp a,
                                     Dfp one)
        Compute exp(a).
        Parameters:
        a - number for which we want the exponential
        one - constant with value 1 at desired precision
        Returns:
        exp(a)
      • computeLn

        public static Dfp computeLn​(Dfp a,
                                    Dfp one,
                                    Dfp two)
        Compute ln(a).
        
          Let f(x) = ln(x),
        
          We know that f'(x) = 1/x, thus from Taylor's theorem we have:
        
                   -----          n+1         n
          f(x) =   \           (-1)    (x - 1)
                   /          ----------------    for 1 <= n <= infinity
                   -----             n
        
          or
                               2        3       4
                           (x-1)   (x-1)    (x-1)
          ln(x) =  (x-1) - ----- + ------ - ------ + ...
                             2       3        4
        
          alternatively,
        
                          2    3   4
                         x    x   x
          ln(x+1) =  x - -  + - - - + ...
                         2    3   4
        
          This series can be used to compute ln(x), but it converges too slowly.
        
          If we substitute -x for x above, we get
        
                           2    3    4
                          x    x    x
          ln(1-x) =  -x - -  - -  - - + ...
                          2    3    4
        
          Note that all terms are now negative.  Because the even powered ones
          absorbed the sign.  Now, subtract the series above from the previous
          one to get ln(x+1) - ln(1-x).  Note the even terms cancel out leaving
          only the odd ones
        
                                     3     5      7
                                   2x    2x     2x
          ln(x+1) - ln(x-1) = 2x + --- + --- + ---- + ...
                                    3     5      7
        
          By the property of logarithms that ln(a) - ln(b) = ln (a/b) we have:
        
                                        3        5        7
              x+1           /          x        x        x          \
          ln ----- =   2 *  |  x  +   ----  +  ----  +  ---- + ...  |
              x-1           \          3        5        7          /
        
          But now we want to find ln(a), so we need to find the value of x
          such that a = (x+1)/(x-1).   This is easily solved to find that
          x = (a-1)/(a+1).
         
        Parameters:
        a - number for which we want the exponential
        one - constant with value 1 at desired precision
        two - constant with value 2 at desired precision
        Returns:
        ln(a)