public class Dfp extends java.lang.Object implements FieldElement<Dfp>
Another floating point class. This one is built using radix 10000 which is 104, so its almost decimal.
The design goals here are:
Trade offs:
Numbers are represented in the following form:
n = sign × mant × (radix)exp;where sign is ±1, mantissa represents a fractional number between zero and one. mant[0] is the least significant digit. exp is in the range of -32767 to 32768
IEEE 854-1987 Notes and differences
IEEE 854 requires the radix to be either 2 or 10. The radix here is 10000, so that requirement is not met, but it is possible that a subclassed can be made to make it behave as a radix 10 number. It is my opinion that if it looks and behaves as a radix 10 number then it is one and that requirement would be met.
The radix of 10000 was chosen because it should be faster to operate on 4 decimal digits at once instead of one at a time. Radix 10 behavior can be realized by add an additional rounding step to ensure that the number of decimal digits represented is constant.
The IEEE standard specifically leaves out internal data encoding, so it is reasonable to conclude that such a subclass of this radix 10000 system is merely an encoding of a radix 10 system.
IEEE 854 also specifies the existence of "sub-normal" numbers. This class does not contain any such entities. The most significant radix 10000 digit is always non-zero. Instead, we support "gradual underflow" by raising the underflow flag for numbers less with exponent less than expMin, but don't flush to zero until the exponent reaches MIN_EXP-digits. Thus the smallest number we can represent would be: 1E(-(MIN_EXP-digits-1)*4), eg, for digits=5, MIN_EXP=-32767, that would be 1e-131092.
IEEE 854 defines that the implied radix point lies just to the right of the most significant digit and to the left of the remaining digits. This implementation puts the implied radix point to the left of all digits including the most significant one. The most significant digit here is the one just to the right of the radix point. This is a fine detail and is really only a matter of definition. Any side effects of this can be rendered invisible by a subclass.
DfpField
Modifier and Type | Field and Description |
---|---|
static int |
ERR_SCALE
The amount under/overflows are scaled by before going to trap handler
|
static byte |
FINITE
Indicator value for normal finite numbers.
|
static byte |
INFINITE
Indicator value for Infinity.
|
static int |
MAX_EXP
The maximum exponent before overflow is signaled and results flushed
to infinity
|
static int |
MIN_EXP
The minimum exponent before underflow is signaled.
|
static byte |
QNAN
Indicator value for quiet NaN.
|
static int |
RADIX
The radix, or base of this system.
|
static byte |
SNAN
Indicator value for signaling NaN.
|
Modifier and Type | Method and Description |
---|---|
Dfp |
add(Dfp x)
Add x to this.
|
Dfp |
ceil()
Round to an integer using the round ceil mode.
|
int |
classify()
Returns the type - one of FINITE, INFINITE, SNAN, QNAN.
|
static Dfp |
copysign(Dfp x,
Dfp y)
Creates an instance that is the same as x except that it has the sign of y.
|
Dfp |
divide(Dfp divisor)
Divide this by divisor.
|
Dfp |
divide(int divisor)
Divide by a single digit less than radix.
|
Dfp |
dotrap(int type,
java.lang.String what,
Dfp oper,
Dfp result)
Raises a trap.
|
boolean |
equals(java.lang.Object other)
Check if instance is equal to x.
|
Dfp |
floor()
Round to an integer using the round floor mode.
|
DfpField |
getField()
|
Dfp |
getOne()
Get the constant 1.
|
int |
getRadixDigits()
Get the number of radix digits of the instance.
|
Dfp |
getTwo()
Get the constant 2.
|
Dfp |
getZero()
Get the constant 0.
|
boolean |
greaterThan(Dfp x)
Check if instance is greater than x.
|
int |
hashCode()
Gets a hashCode for the instance.
|
int |
intValue()
Convert this to an integer.
|
boolean |
isInfinite()
Check if instance is infinite.
|
boolean |
isNaN()
Check if instance is not a number.
|
boolean |
lessThan(Dfp x)
Check if instance is less than x.
|
int |
log10()
Get the exponent of the greatest power of 10 that is less than or equal to abs(this).
|
int |
log10K()
Get the exponent of the greatest power of 10000 that is
less than or equal to the absolute value of this.
|
Dfp |
multiply(Dfp x)
Multiply this by x.
|
Dfp |
multiply(int x)
Multiply this by a single digit 0<=x<radix.
|
Dfp |
negate()
Returns a number that is this number with the sign bit reversed.
|
Dfp |
newInstance()
Create an instance with a value of 0.
|
Dfp |
newInstance(byte x)
Create an instance from a byte value.
|
Dfp |
newInstance(byte sig,
byte code)
Creates an instance with a non-finite value.
|
Dfp |
newInstance(Dfp d)
Create an instance by copying an existing one.
|
Dfp |
newInstance(double x)
Create an instance from a double value.
|
Dfp |
newInstance(int x)
Create an instance from an int value.
|
Dfp |
newInstance(long x)
Create an instance from a long value.
|
Dfp |
newInstance(java.lang.String s)
Create an instance from a String representation.
|
Dfp |
nextAfter(Dfp x)
Returns the next number greater than this one in the direction of x.
|
Dfp |
power10(int e)
Return the specified power of 10.
|
Dfp |
power10K(int e)
Get the specified power of 10000.
|
Dfp |
remainder(Dfp d)
Returns the IEEE remainder.
|
Dfp |
rint()
Round to nearest integer using the round-half-even method.
|
Dfp |
sqrt()
Compute the square root.
|
Dfp |
subtract(Dfp x)
Subtract x from this.
|
double |
toDouble()
Convert the instance into a double.
|
double[] |
toSplitDouble()
Convert the instance into a split double.
|
java.lang.String |
toString()
Get a string representation of the instance.
|
boolean |
unequal(Dfp x)
Check if instance is not equal to x.
|
public static final int RADIX
public static final int MIN_EXP
public static final int MAX_EXP
public static final int ERR_SCALE
public static final byte FINITE
public static final byte INFINITE
public static final byte SNAN
public static final byte QNAN
public Dfp(Dfp d)
d
- instance to copypublic Dfp newInstance()
public Dfp newInstance(byte x)
x
- value to convert to an instancepublic Dfp newInstance(int x)
x
- value to convert to an instancepublic Dfp newInstance(long x)
x
- value to convert to an instancepublic Dfp newInstance(double x)
x
- value to convert to an instancepublic Dfp newInstance(Dfp d)
d
- instance to copypublic Dfp newInstance(java.lang.String s)
s
- string representation of the instancepublic Dfp newInstance(byte sig, byte code)
public DfpField getField()
Field
(really a DfpField
) to which the instance belongs.
The field is linked to the number of digits and acts as a factory
for Dfp
instances.
getField
in interface FieldElement<Dfp>
Field
(really a DfpField
) to which the instance belongspublic int getRadixDigits()
public Dfp getZero()
public Dfp getOne()
public Dfp getTwo()
public boolean lessThan(Dfp x)
x
- number to check instance againstpublic boolean greaterThan(Dfp x)
x
- number to check instance againstpublic boolean isInfinite()
public boolean isNaN()
public boolean equals(java.lang.Object other)
equals
in class java.lang.Object
other
- object to check instance againstpublic int hashCode()
hashCode
in class java.lang.Object
public boolean unequal(Dfp x)
x
- number to check instance againstpublic Dfp rint()
public Dfp floor()
public Dfp ceil()
public Dfp remainder(Dfp d)
d
- divisorpublic int intValue()
public int log10K()
public Dfp power10K(int e)
e
- desired powerpublic int log10()
public Dfp power10(int e)
e
- desired powerpublic Dfp add(Dfp x)
add
in interface FieldElement<Dfp>
x
- number to addpublic Dfp negate()
public Dfp subtract(Dfp x)
subtract
in interface FieldElement<Dfp>
x
- number to subtractpublic Dfp multiply(Dfp x)
multiply
in interface FieldElement<Dfp>
x
- multiplicandpublic Dfp multiply(int x)
x
- multiplicandpublic Dfp divide(Dfp divisor)
divide
in interface FieldElement<Dfp>
divisor
- divisorpublic Dfp divide(int divisor)
divisor
- divisorpublic Dfp sqrt()
public java.lang.String toString()
toString
in class java.lang.Object
public Dfp dotrap(int type, java.lang.String what, Dfp oper, Dfp result)
type
- the trap typewhat
- - name of routine trap occurred inoper
- - input operator to functionresult
- - the result computed prior to the trappublic int classify()
public static Dfp copysign(Dfp x, Dfp y)
x
- number to get the value fromy
- number to get the sign frompublic Dfp nextAfter(Dfp x)
x
- direction where to look atpublic double toDouble()
toSplitDouble()
public double[] toSplitDouble()
toDouble()
"Copyright © 2010 - 2020 Adobe Systems Incorporated. All Rights Reserved"