public final class DD extends Objectimplements Serializable , Comparable , Cloneable
A DoubleDouble uses a representation containing two double-precision values. A number x is represented as a pair of doubles, x.hi and x.lo, such that the number represented by x is x.hi + x.lo, where
|x.lo| <= 0.5*ulp(x.hi)
and ulp(y) means "unit in the last place of y". The basic arithmetic operations are implemented using convenient properties of IEEE-754 floating-point arithmetic.
The range of values which can be represented is the same as in IEEE-754. The precision of the representable numbers is twice as great as IEEE-754 double precision.
The correctness of the arithmetic algorithms relies on operations being performed with standard IEEE-754 double precision and rounding. This is the Java standard arithmetic model, but for performance reasons Java implementations are not constrained to using this standard by default. Some processors (notably the Intel Pentium architecure) perform floating point operations in (non-IEEE-754-standard) extended-precision. A JVM implementation may choose to use the non-standard extended-precision as its default arithmetic mode. To prevent this from happening, this code uses the Java strictfp modifier, which forces all operations to take place in the standard IEEE-754 rounding model.
The API provides both a set of value-oriented operations and a set of mutating operations. Value-oriented operations treat DoubleDouble values as immutable; operations on them return new objects carrying the result of the operation. This provides a simple and safe semantics for writing DoubleDouble expressions. However, there is a performance penalty for the object allocations required. The mutable interface updates object values in-place. It provides optimum memory performance, but requires care to ensure that aliasing errors are not created and constant values are not changed.
For example, the following code example constructs three DD instances: two to hold the input values and one to hold the result of the addition.
DD a = new DD(2.0);
DD b = new DD(3.0);
DD c = a.add(b);
In contrast, the following approach uses only one object:
DD a = new DD(2.0);
a.selfAdd(3.0);
This implementation uses algorithms originally designed variously by Knuth, Kahan, Dekker, and Linnainmaa. Douglas Priest developed the first C implementation of these techniques. Other more recent C++ implementation are due to Keith M. Briggs and David Bailey et al.
| Modifier and Type | Field and Description |
|---|---|
static DD |
E
The value nearest to the constant e (the natural logarithm base).
|
static double |
EPS
The smallest representable relative difference between two {link @ DoubleDouble} values
|
static DD |
NaN
A value representing the result of an operation which does not return a valid number.
|
static DD |
PI
The value nearest to the constant Pi.
|
static DD |
PI_2
The value nearest to the constant Pi / 2.
|
static DD |
TWO_PI
The value nearest to the constant 2 * Pi.
|
| Constructor and Description |
|---|
DD()
Creates a new DoubleDouble with value 0.0.
|
DD(DD
Creates a new DoubleDouble with value equal to the argument.
|
DD(double x)
Creates a new DoubleDouble with value x.
|
DD(double hi, double lo)
Creates a new DoubleDouble with value (hi, lo).
|
DD(String
Creates a new DoubleDouble with value equal to the argument.
|
| Modifier and Type | Method and Description |
|---|---|
DD |
abs()
Returns the absolute value of this value.
|
DD |
add(DD
Returns a new DoubleDouble whose value is
(this + y).
|
DD |
add(double y)
Returns a new DoubleDouble whose value is
(this + y).
|
DD |
ceil()
Returns the smallest (closest to negative infinity) value that is not less than the argument and is equal to a mathematical integer.
|
Object |
clone()
Creates and returns a copy of this value.
|
int |
compareTo(Object
Compares two DoubleDouble objects numerically.
|
static DD |
copy(DD
Creates a new DoubleDouble with the value of the argument.
|
DD |
divide(DD
Computes a new DoubleDouble whose value is
(this / y).
|
DD |
divide(double y)
Computes a new DoubleDouble whose value is
(this / y).
|
double |
doubleValue()
Converts this value to the nearest double-precision number.
|
String |
dump()
Dumps the components of this number to a string.
|
boolean |
equals(DD
Tests whether this value is equal to another
DoubleDouble value.
|
DD |
floor()
Returns the largest (closest to positive infinity) value that is not greater than the argument and is equal to a mathematical integer.
|
boolean |
ge(DD
Tests whether this value is greater than or equals to another
DoubleDouble value.
|
boolean |
gt(DD
Tests whether this value is greater than another
DoubleDouble value.
|
int |
intValue()
Converts this value to the nearest integer.
|
boolean |
isNaN()
Tests whether this value is NaN.
|
boolean |
isNegative()
Tests whether this value is less than 0.
|
boolean |
isPositive()
Tests whether this value is greater than 0.
|
boolean |
isZero()
Tests whether this value is equal to 0.
|
boolean |
le(DD
Tests whether this value is less than or equal to another
DoubleDouble value.
|
boolean |
lt(DD
Tests whether this value is less than another
DoubleDouble value.
|
DD |
max(DD
Computes the maximum of this and another DD number.
|
DD |
min(DD
Computes the minimum of this and another DD number.
|
DD |
multiply(DD
Returns a new DoubleDouble whose value is
(this * y).
|
DD |
multiply(double y)
Returns a new DoubleDouble whose value is
(this * y).
|
DD |
negate()
Returns a new DoubleDouble whose value is
-this.
|
static DD |
parse(String
Converts a string representation of a real number into a DoubleDouble value.
|
DD |
pow(int exp)
Computes the value of this number raised to an integral power.
|
DD |
reciprocal()
Returns a DoubleDouble whose value is
1 / this.
|
DD |
rint()
Rounds this value to the nearest integer.
|
DD |
selfAdd(DD
Adds the argument to the value of
this.
|
DD |
selfAdd(double y)
Adds the argument to the value of
this.
|
DD |
selfDivide(DD
Divides this object by the argument, returning
this.
|
DD |
selfDivide(double y)
Divides this object by the argument, returning
this.
|
DD |
selfMultiply(DD
Multiplies this object by the argument, returning
this.
|
DD |
selfMultiply(double y)
Multiplies this object by the argument, returning
this.
|
DD |
selfSqr()
Squares this object.
|
DD |
selfSubtract(DD
Subtracts the argument from the value of
this.
|
DD |
selfSubtract(double y)
Subtracts the argument from the value of
this.
|
DD |
setValue(DD
Set the value for the DD object.
|
DD |
setValue(double value)
Set the value for the DD object.
|
int |
signum()
Returns an integer indicating the sign of this value.
|
DD |
sqr()
Computes the square of this value.
|
static DD |
sqr(double x)
Computes the square of this value.
|
DD |
sqrt()
Computes the positive square root of this value.
|
static DD |
sqrt(double x)
|
DD |
subtract(DD
Computes a new DoubleDouble object whose value is
(this - y).
|
DD |
subtract(double y)
Computes a new DoubleDouble object whose value is
(this - y).
|
String |
toSciNotation()
Returns the string representation of this value in scientific notation.
|
String |
toStandardNotation()
Returns the string representation of this value in standard notation.
|
String |
toString()
Returns a string representation of this number, in either standard or scientific notation.
|
DD |
trunc()
Returns the integer which is largest in absolute value and not further from zero than this value.
|
static DD |
valueOf(double x)
Converts the
double argument to a DoubleDouble number.
|
static DD |
valueOf(String
Converts the string argument to a DoubleDouble number.
|
public static final DDPI
public static final DDTWO_PI
public static final DDPI_2
public static final DDE
public static final DDNaN
public static final double EPS
public DD()
public DD(double x)
x - the value to initialize
public DD(double hi,
double lo)
hi - the high-order component
lo - the high-order component
public DD(DDdd)
dd - the value to initialize
public DD(Stringstr) throws NumberFormatException
str - the value to initialize by
NumberFormatException - if
str is not a valid representation of a number
public static DDvalueOf(String str) throws NumberFormatException
str - a string containing a representation of a numeric value
NumberFormatException - if
s is not a valid representation of a number
public static DDvalueOf(double x)
x - a numeric value
public static DDcopy(DD dd)
dd - the DoubleDouble value to copy
public Objectclone()
public DDsetValue(DD value)
value - a DD instance supplying an extended-precision value.
public DDsetValue(double value)
value - a floating point value to be stored in the instance.
public final DDadd(DD y)
y - the addend
public final DDadd(double y)
y - the addend
public final DDselfAdd(DD y)
y - the addend
public final DDselfAdd(double y)
y - the addend
public final DDsubtract(DD y)
y - the subtrahend
public final DDsubtract(double y)
y - the subtrahend
public final DDselfSubtract(DD y)
y - the addend
public final DDselfSubtract(double y)
y - the addend
public final DDnegate()
public final DDmultiply(DD y)
y - the multiplicand
public final DDmultiply(double y)
y - the multiplicand
public final DDselfMultiply(DD y)
y - the value to multiply by
public final DDselfMultiply(double y)
y - the value to multiply by
public final DDdivide(DD y)
y - the divisor
public final DDdivide(double y)
y - the divisor
public final DDselfDivide(DD y)
y - the value to divide by
public final DDselfDivide(double y)
y - the value to divide by
public final DDreciprocal()
public DDfloor()
public DDceil()
public int signum()
public DDrint()
public DDtrunc()
public DDabs()
public DDsqr()
public DDselfSqr()
public static DDsqr(double x)
public DDsqrt()
public static DDsqrt(double x)
public DDpow(int exp)
exp - the integer exponent
public DDmin(DD x)
x - a DD number
public DDmax(DD x)
x - a DD number
public double doubleValue()
public int intValue()
public boolean isZero()
public boolean isNegative()
public boolean isPositive()
public boolean isNaN()
public boolean equals(DDy)
y - a DoubleDouble value
public boolean gt(DDy)
y - a DoubleDouble value
public boolean ge(DDy)
y - a DoubleDouble value
public boolean lt(DDy)
y - a DoubleDouble value
public boolean le(DDy)
y - a DoubleDouble value
public int compareTo(Objecto)
compareTo in interface
Comparable
public Stringdump()
public StringtoString()
public StringtoStandardNotation()
public StringtoSciNotation()
public static DDparse(String str) throws NumberFormatException
[+|-] {digit} [ . {digit} ] [ ( e | E ) [+|-] {digit}+
str - the string to parse
NumberFormatException - if
str is not a valid representation of a number