Class DfpField

  • All Implemented Interfaces:
    Field<Dfp>

    public class DfpField
    extends java.lang.Object
    implements Field<Dfp>
    Field for Decimal floating point instances.
    Since:
    2.2
    Version:
    $Revision: 995987 $ $Date: 2010-09-10 23:24:15 +0200 (ven. 10 sept. 2010) $
    • Field Detail

      • FLAG_INVALID

        public static final int FLAG_INVALID
        IEEE 854-1987 flag for invalid operation.
        See Also:
        Constant Field Values
      • FLAG_DIV_ZERO

        public static final int FLAG_DIV_ZERO
        IEEE 854-1987 flag for division by zero.
        See Also:
        Constant Field Values
      • FLAG_OVERFLOW

        public static final int FLAG_OVERFLOW
        IEEE 854-1987 flag for overflow.
        See Also:
        Constant Field Values
      • FLAG_UNDERFLOW

        public static final int FLAG_UNDERFLOW
        IEEE 854-1987 flag for underflow.
        See Also:
        Constant Field Values
      • FLAG_INEXACT

        public static final int FLAG_INEXACT
        IEEE 854-1987 flag for inexact result.
        See Also:
        Constant Field Values
    • 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
      • setRoundingMode

        public void setRoundingMode​(DfpField.RoundingMode mode)
        Set the rounding mode. If not set, the default value is DfpField.RoundingMode.ROUND_HALF_EVEN.
        Parameters:
        mode - desired rounding mode Note that the rounding mode is common to all Dfp instances belonging to the current DfpField in the system and will affect all future calculations.
      • getRoundingMode

        public DfpField.RoundingMode getRoundingMode()
        Get the current rounding mode.
        Returns:
        current rounding mode
      • 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​(java.lang.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
      • getZero

        public Dfp getZero()
        Get the constant 0.
        Specified by:
        getZero in interface Field<Dfp>
        Returns:
        a Dfp with value 0
      • getOne

        public Dfp getOne()
        Get the constant 1.
        Specified by:
        getOne in interface Field<Dfp>
        Returns:
        a Dfp with value 1
      • 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
      • getSqr2Reciprocal

        public Dfp getSqr2Reciprocal()
        Get the constant √2 / 2.
        Returns:
        a Dfp with value √2 / 2
      • getSqr3

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

        public Dfp getSqr3Reciprocal()
        Get the constant √3 / 3.
        Returns:
        a Dfp with value √3 / 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)