/*
* @(#)Double.java 1.94 04/05/11
*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package java.lang;
import sun.misc.FloatingDecimal;
import sun.misc.FpUtils;
import sun.misc.DoubleConsts;
/**
* The Double
class wraps a value of the primitive type
* double
in an object. An object of type
* Double
contains a single field whose type is
* double
.
*
* In addition, this class provides several methods for converting a
*
* To create localized string representations of a floating-point
* value, use subclasses of {@link java.text.NumberFormat}.
*
* @param d the If Leading and trailing whitespace characters in
*
*
*
*
*
*
*
* To interpret localized string representations of a
* floating-point value, use subclasses of {@link
* java.text.NumberFormat}.
*
* Note that trailing format specifiers, specifiers that
* determine the type of a floating-point literal
* ( To avoid calling this method on a invalid string and having
* a
* Note that in most cases, for two instances of class
*
* also has the value
* Bit 63 (the bit that is selected by the mask
*
* If the argument is positive infinity, the result is
*
* If the argument is negative infinity, the result is
*
* If the argument is NaN, the result is
*
* In all cases, the result is a
* Bit 63 (the bit that is selected by the mask
*
* If the argument is positive infinity, the result is
*
* If the argument is negative infinity, the result is
*
* If the argument is NaN, the result is the
* In all cases, the result is a
* If the argument is
* If the argument is
* If the argument is any value in the range
*
* In all other cases, let s, e, and m be three
* values that can be computed from the argument:
*
* Note that this method may not be able to return a
* double
to a String
and a
* String
to a double
, as well as other
* constants and methods useful when dealing with a
* double
.
*
* @author Lee Boynton
* @author Arthur van Hoff
* @author Joseph D. Darcy
* @version 1.94, 05/11/04
* @since JDK1.0
*/
public final class Double extends Number implements Comparabledouble
. It is equal to the value returned by
* Double.longBitsToDouble(0x7ff0000000000000L)
.
*/
public static final double POSITIVE_INFINITY = 1.0 / 0.0;
/**
* A constant holding the negative infinity of type
* double
. It is equal to the value returned by
* Double.longBitsToDouble(0xfff0000000000000L)
.
*/
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
/**
* A constant holding a Not-a-Number (NaN) value of type
* double
. It is equivalent to the value returned by
* Double.longBitsToDouble(0x7ff8000000000000L)
.
*/
public static final double NaN = 0.0d / 0.0;
/**
* A constant holding the largest positive finite value of type
* double
,
* (2-2-52)·21023. It is equal to
* the hexadecimal floating-point literal
* 0x1.fffffffffffffP+1023
and also equal to
* Double.longBitsToDouble(0x7fefffffffffffffL)
.
*/
public static final double MAX_VALUE = 1.7976931348623157e+308; // 0x1.fffffffffffffP+1023
/**
* A constant holding the smallest positive nonzero value of type
* double
, 2-1074. It is equal to the
* hexadecimal floating-point literal
* 0x0.0000000000001P-1022
and also equal to
* Double.longBitsToDouble(0x1L)
.
*/
public static final double MIN_VALUE = 4.9e-324; // 0x0.0000000000001P-1022
/**
* The number of bits used to represent a double value.
*
* @since 1.5
*/
public static final int SIZE = 64;
/**
* The Class
instance representing the primitive type
* double
.
*
* @since JDK1.1
*/
public static final Classdouble
* argument. All characters mentioned below are ASCII characters.
*
*
* How many digits must be printed for the fractional part of
* m or a? There must be at least one digit to represent
* the fractional part, and beyond that as many, but only as many, more
* digits as are needed to uniquely distinguish the argument value from
* adjacent values of type NaN
".
* -
'
* ('\u002D'
); if the sign is positive, no sign character
* appears in the result. As for the magnitude m:
*
*
* "Infinity"
; thus, positive infinity produces the result
* "Infinity"
and negative infinity produces the result
* "-Infinity"
.
*
* "0.0"
; thus, negative zero produces the result
* "-0.0"
and positive zero produces the result
* "0.0"
.
*
* .
' ('\u002E'
), followed by one or
* more decimal digits representing the fractional part of m.
*
* .
'
* ('\u002E'
), followed by decimal digits
* representing the fractional part of a, followed by the
* letter 'E
' ('\u0045'
), followed
* by a representation of n as a decimal integer, as
* produced by the method {@link Integer#toString(int)}.
* double
. That is, suppose that
* x is the exact mathematical value represented by the decimal
* representation produced by this method for a finite nonzero argument
* d. Then d must be the double
value nearest
* to x; or if two double
values are equally close
* to x, then d must be one of them and the least
* significant bit of the significand of d must be 0
.
* double
to be converted.
* @return a string representation of the argument.
*/
public static String toString(double d) {
return new FloatingDecimal(d).toJavaFormatString();
}
/**
* Returns a hexadecimal string representation of the
* double
argument. All characters mentioned below
* are ASCII characters.
*
*
*
*
* NaN
".
* -
'
* ('\u002D'
); if the sign is positive, no sign
* character appears in the result. As for the magnitude m:
*
*
*
*
* "Infinity"
; thus, positive infinity produces the
* result "Infinity"
and negative infinity produces
* the result "-Infinity"
.
*
* "0x0.0p0"
; thus, negative zero produces the result
* "-0x0.0p0"
and positive zero produces the result
* "0x0.0p0"
.
*
* double
value with a
* normalized representation, substrings are used to represent the
* significand and exponent fields. The significand is
* represented by the characters "0x1."
* followed by a lowercase hexadecimal representation of the rest
* of the significand as a fraction. Trailing zeros in the
* hexadecimal representation are removed unless all the digits
* are zero, in which case a single zero is used. Next, the
* exponent is represented by "p"
followed
* by a decimal string of the unbiased exponent as if produced by
* a call to {@link Integer#toString(int) Integer.toString} on the
* exponent value.
*
* double
value with a subnormal
* representation, the significand is represented by the
* characters "0x0."
followed by a
* hexadecimal representation of the rest of the significand as a
* fraction. Trailing zeros in the hexadecimal representation are
* removed. Next, the exponent is represented by
* "p-1022"
. Note that there must be at
* least one nonzero digit in a subnormal significand.
*
*
*
* @param d the Examples
Floating-point Value Hexadecimal String
* 1.0
* 0x1.0p0
-1.0
* -0x1.0p0
2.0
* 0x1.0p1
3.0
* 0x1.8p1
0.5
* 0x1.0p-1
0.25
* 0x1.0p-2
* Double.MAX_VALUE
* 0x1.fffffffffffffp1023
* Minimum Normal Value
* 0x1.0p-1022
* Maximum Subnormal Value
* 0x0.fffffffffffffp-1022
* Double.MIN_VALUE
* 0x0.0000000000001p-1022
double
to be converted.
* @return a hex string representation of the argument.
* @since 1.5
* @author Joseph D. Darcy
*/
public static String toHexString(double d) {
/*
* Modeled after the "a" conversion specifier in C99, section
* 7.19.6.1; however, the output of this method is more
* tightly specified.
*/
if (!FpUtils.isFinite(d) )
// For infinity and NaN, use the decimal output.
return Double.toString(d);
else {
// Initialized to maximum size of output.
StringBuffer answer = new StringBuffer(24);
if (FpUtils.rawCopySign(1.0, d) == -1.0) // value is negative,
answer.append("-"); // so append sign info
answer.append("0x");
d = Math.abs(d);
if(d == 0.0) {
answer.append("0.0p0");
}
else {
boolean subnormal = (d < DoubleConsts.MIN_NORMAL);
// Isolate significand bits and OR in a high-order bit
// so that the string representation has a known
// length.
long signifBits = (Double.doubleToLongBits(d)
& DoubleConsts.SIGNIF_BIT_MASK) |
0x1000000000000000L;
// Subnormal values have a 0 implicit bit; normal
// values have a a 1 implicit bit.
answer.append(subnormal ? "0." : "1.");
// Isolate the low-order 13 digits of the hex
// representation. If all the digits are zero,
// replace with a single 0; otherwise, remove all
// trailing zeros.
String signif = Long.toHexString(signifBits).substring(3,16);
answer.append(signif.equals("0000000000000") ? // 13 zeros
"0":
signif.replaceFirst("0{1,12}$", ""));
// If the value is subnormal, use the E_min exponent
// value for double; otherwise, extract and report d's
// exponent (the representation of a subnormal uses
// E_min -1).
answer.append("p" + (subnormal ?
DoubleConsts.MIN_EXPONENT:
FpUtils.getExponent(d) ));
}
return answer.toString();
}
}
/**
* Returns a Double
object holding the
* double
value represented by the argument string
* s
.
*
* s
is null
, then a
* NullPointerException
is thrown.
*
* s
* are ignored. Whitespace is removed as if by the {@link
* String#trim} method; that is, both ASCII space and control
* characters are removed. The rest of s
should
* constitute a FloatValue as described by the lexical
* syntax rules:
*
*
*
*
* where Sign, FloatingPointLiteral,
* HexNumeral, HexDigits, SignedInteger and
* FloatTypeSuffix are as defined in the lexical structure
* sections of the of the Java Language
* Specification. If
*
*
* NaN
* Infinity
*
*
*
*
*
*
* .
* 0x
HexDigitsopt
* .
HexDigits
* 0X
HexDigitsopt
* .
HexDigits
*
*
*
*
*
*
* p
* P
* s
does not have the form of
* a FloatValue, then a NumberFormatException
* is thrown. Otherwise, s
is regarded as
* representing an exact decimal value in the usual
* "computerized scientific notation" or as an exact
* hexadecimal value; this exact numerical value is then
* conceptually converted to an "infinitely precise"
* binary value that is then rounded to type double
* by the usual round-to-nearest rule of IEEE 754 floating-point
* arithmetic, which includes preserving the sign of a zero
* value. Finally, a Double
object representing this
* double
value is returned.
*
* 1.0f
is a float
value;
* 1.0d
is a double
value), do
* not influence the results of this method. In other
* words, the numerical value of the input string is converted
* directly to the target floating-point type. The two-step
* sequence of conversions, string to float
followed
* by float
to double
, is not
* equivalent to converting a string directly to
* double
. For example, the float
* literal 0.1f
is equal to the double
* value 0.10000000149011612
; the float
* literal 0.1f
represents a different numerical
* value than the double
literal
* 0.1
. (The numerical value 0.1 cannot be exactly
* represented in a binary floating-point number.)
*
* NumberFormatException
be thrown, the regular
* expression below can be used to screen the input string:
*
*
*
*
* @param s the string to be parsed.
* @return a
* final String Digits = "(\\p{Digit}+)";
* final String HexDigits = "(\\p{XDigit}+)";
* // an exponent is 'e' or 'E' followed by an optionally
* // signed decimal integer.
* final String Exp = "[eE][+-]?"+Digits;
* final String fpRegex =
* ("[\\x00-\\x20]*"+ // Optional leading "whitespace"
* "[+-]?(" + // Optional sign character
* "NaN|" + // "NaN" string
* "Infinity|" + // "Infinity" string
*
* // A decimal floating-point string representing a finite positive
* // number without a leading sign has at most five basic pieces:
* // Digits . Digits ExponentPart FloatTypeSuffix
* //
* // Since this method allows integer-only strings as input
* // in addition to strings of floating-point literals, the
* // two sub-patterns below are simplifications of the grammar
* // productions from the Java Language Specification, 2nd
* // edition, section 3.10.2.
*
* // Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
* "((("+Digits+"(\\.)?("+Digits+"?)("+Exp+")?)|"+
*
* // . Digits ExponentPart_opt FloatTypeSuffix_opt
* "(\\.("+Digits+")("+Exp+")?)|"+
*
* // Hexadecimal strings
* "((" +
* // 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
* "(0[xX]" + HexDigits + "(\\.)?)|" +
*
* // 0[xX] HexDigits_opt . HexDigits BinaryExponent FloatTypeSuffix_opt
* "(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +
*
* ")[pP][+-]?" + Digits + "))" +
* "[fFdD]?))" +
* "[\\x00-\\x20]*");// Optional trailing "whitespace"
*
* if (Pattern.matches(fpRegex, myString))
* Double.valueOf(myString); // Will not throw NumberFormatException
* else {
* // Perform suitable alternative action
* }
*
* Double
object holding the value
* represented by the String
argument.
* @exception NumberFormatException if the string does not contain a
* parsable number.
*/
public static Double valueOf(String s) throws NumberFormatException {
return new Double(FloatingDecimal.readJavaFormatString(s).doubleValue());
}
/**
* Returns a Double instance representing the specified
* double value.
* If a new Double instance is not required, this method
* should generally be used in preference to the constructor
* {@link #Double(double)}, as this method is likely to yield
* significantly better space and time performance by caching
* frequently requested values.
*
* @param d a double value.
* @return a Double instance representing d.
* @since 1.5
*/
public static Double valueOf(double d) {
return new Double(d);
}
/**
* Returns a new double
initialized to the value
* represented by the specified String
, as performed
* by the valueOf
method of class
* Double
.
*
* @param s the string to be parsed.
* @return the double
value represented by the string
* argument.
* @exception NumberFormatException if the string does not contain
* a parsable double
.
* @see java.lang.Double#valueOf(String)
* @since 1.2
*/
public static double parseDouble(String s) throws NumberFormatException {
return FloatingDecimal.readJavaFormatString(s).doubleValue();
}
/**
* Returns true
if the specified number is a
* Not-a-Number (NaN) value, false
otherwise.
*
* @param v the value to be tested.
* @return true
if the value of the argument is NaN;
* false
otherwise.
*/
static public boolean isNaN(double v) {
return (v != v);
}
/**
* Returns true
if the specified number is infinitely
* large in magnitude, false
otherwise.
*
* @param v the value to be tested.
* @return true
if the value of the argument is positive
* infinity or negative infinity; false
otherwise.
*/
static public boolean isInfinite(double v) {
return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
}
/**
* The value of the Double.
*
* @serial
*/
private final double value;
/**
* Constructs a newly allocated Double
object that
* represents the primitive double
argument.
*
* @param value the value to be represented by the Double
.
*/
public Double(double value) {
this.value = value;
}
/**
* Constructs a newly allocated Double
object that
* represents the floating-point value of type double
* represented by the string. The string is converted to a
* double
value as if by the valueOf
method.
*
* @param s a string to be converted to a Double
.
* @exception NumberFormatException if the string does not contain a
* parsable number.
* @see java.lang.Double#valueOf(java.lang.String)
*/
public Double(String s) throws NumberFormatException {
// REMIND: this is inefficient
this(valueOf(s).doubleValue());
}
/**
* Returns true
if this Double
value is
* a Not-a-Number (NaN), false
otherwise.
*
* @return true
if the value represented by this object is
* NaN; false
otherwise.
*/
public boolean isNaN() {
return isNaN(value);
}
/**
* Returns true
if this Double
value is
* infinitely large in magnitude, false
otherwise.
*
* @return true
if the value represented by this object is
* positive infinity or negative infinity;
* false
otherwise.
*/
public boolean isInfinite() {
return isInfinite(value);
}
/**
* Returns a string representation of this Double
object.
* The primitive double
value represented by this
* object is converted to a string exactly as if by the method
* toString
of one argument.
*
* @return a String
representation of this object.
* @see java.lang.Double#toString(double)
*/
public String toString() {
return String.valueOf(value);
}
/**
* Returns the value of this Double
as a byte
(by
* casting to a byte
).
*
* @return the double
value represented by this object
* converted to type byte
* @since JDK1.1
*/
public byte byteValue() {
return (byte)value;
}
/**
* Returns the value of this Double
as a
* short
(by casting to a short
).
*
* @return the double
value represented by this object
* converted to type short
* @since JDK1.1
*/
public short shortValue() {
return (short)value;
}
/**
* Returns the value of this Double
as an
* int
(by casting to type int
).
*
* @return the double
value represented by this object
* converted to type int
*/
public int intValue() {
return (int)value;
}
/**
* Returns the value of this Double
as a
* long
(by casting to type long
).
*
* @return the double
value represented by this object
* converted to type long
*/
public long longValue() {
return (long)value;
}
/**
* Returns the float
value of this
* Double
object.
*
* @return the double
value represented by this object
* converted to type float
* @since JDK1.0
*/
public float floatValue() {
return (float)value;
}
/**
* Returns the double
value of this
* Double
object.
*
* @return the double
value represented by this object
*/
public double doubleValue() {
return (double)value;
}
/**
* Returns a hash code for this Double
object. The
* result is the exclusive OR of the two halves of the
* long
integer bit representation, exactly as
* produced by the method {@link #doubleToLongBits(double)}, of
* the primitive double
value represented by this
* Double
object. That is, the hash code is the value
* of the expression:
*
* where
* (int)(v^(v>>>32))
*
v
is defined by:
*
*
* @return a
* long v = Double.doubleToLongBits(this.doubleValue());
*
hash code
value for this object.
*/
public int hashCode() {
long bits = doubleToLongBits(value);
return (int)(bits ^ (bits >>> 32));
}
/**
* Compares this object against the specified object. The result
* is true
if and only if the argument is not
* null
and is a Double
object that
* represents a double
that has the same value as the
* double
represented by this object. For this
* purpose, two double
values are considered to be
* the same if and only if the method {@link
* #doubleToLongBits(double)} returns the identical
* long
value when applied to each.
* Double
, d1
and d2
, the
* value of d1.equals(d2)
is true
if and
* only if
*
*
* d1.doubleValue() == d2.doubleValue()
*
true
. However, there are two
* exceptions:
*
*
* This definition allows hash tables to operate properly.
* @param obj the object to compare with.
* @return d1
and d2
both represent
* Double.NaN
, then the equals
method
* returns true
, even though
* Double.NaN==Double.NaN
has the value
* false
.
* d1
represents +0.0
while
* d2
represents -0.0
, or vice versa,
* the equal
test has the value false
,
* even though +0.0==-0.0
has the value true
.
* true
if the objects are the same;
* false
otherwise.
* @see java.lang.Double#doubleToLongBits(double)
*/
public boolean equals(Object obj) {
return (obj instanceof Double)
&& (doubleToLongBits(((Double)obj).value) ==
doubleToLongBits(value));
}
/**
* Returns a representation of the specified floating-point value
* according to the IEEE 754 floating-point "double
* format" bit layout.
* 0x8000000000000000L
) represents the sign of the
* floating-point number. Bits
* 62-52 (the bits that are selected by the mask
* 0x7ff0000000000000L
) represent the exponent. Bits 51-0
* (the bits that are selected by the mask
* 0x000fffffffffffffL
) represent the significand
* (sometimes called the mantissa) of the floating-point number.
* 0x7ff0000000000000L
.
* 0xfff0000000000000L
.
* 0x7ff8000000000000L
.
* long
integer that, when
* given to the {@link #longBitsToDouble(long)} method, will produce a
* floating-point value the same as the argument to
* doubleToLongBits
(except all NaN values are
* collapsed to a single "canonical" NaN value).
*
* @param value a double
precision floating-point number.
* @return the bits that represent the floating-point number.
*/
public static native long doubleToLongBits(double value);
/**
* Returns a representation of the specified floating-point value
* according to the IEEE 754 floating-point "double
* format" bit layout, preserving Not-a-Number (NaN) values.
* 0x8000000000000000L
) represents the sign of the
* floating-point number. Bits
* 62-52 (the bits that are selected by the mask
* 0x7ff0000000000000L
) represent the exponent. Bits 51-0
* (the bits that are selected by the mask
* 0x000fffffffffffffL
) represent the significand
* (sometimes called the mantissa) of the floating-point number.
* 0x7ff0000000000000L
.
* 0xfff0000000000000L
.
* long
* integer representing the actual NaN value. Unlike the
* doubleToLongBits
method,
* doubleToRawLongBits
does not collapse all the bit
* patterns encoding a NaN to a single "canonical" NaN
* value.
* long
integer that,
* when given to the {@link #longBitsToDouble(long)} method, will
* produce a floating-point value the same as the argument to
* doubleToRawLongBits
.
*
* @param value a double
precision floating-point number.
* @return the bits that represent the floating-point number.
*/
public static native long doubleToRawLongBits(double value);
/**
* Returns the double
value corresponding to a given
* bit representation.
* The argument is considered to be a representation of a
* floating-point value according to the IEEE 754 floating-point
* "double format" bit layout.
* 0x7ff0000000000000L
, the result
* is positive infinity.
* 0xfff0000000000000L
, the result
* is negative infinity.
* 0x7ff0000000000001L
through
* 0x7fffffffffffffffL
or in the range
* 0xfff0000000000001L
through
* 0xffffffffffffffffL
, the result is a NaN. No IEEE
* 754 floating-point operation provided by Java can distinguish
* between two NaN values of the same type with different bit
* patterns. Distinct values of NaN are only distinguishable by
* use of the Double.doubleToRawLongBits
method.
*
* Then the floating-point result equals the value of the mathematical
* expression s·m·2e-1075.
*
* int s = ((bits >> 63) == 0) ? 1 : -1;
* int e = (int)((bits >> 52) & 0x7ffL);
* long m = (e == 0) ?
* (bits & 0xfffffffffffffL) << 1 :
* (bits & 0xfffffffffffffL) | 0x10000000000000L;
*
double
NaN with exactly same bit pattern as the
* long
argument. IEEE 754 distinguishes between two
* kinds of NaNs, quiet NaNs and signaling NaNs. The
* differences between the two kinds of NaN are generally not
* visible in Java. Arithmetic operations on signaling NaNs turn
* them into quiet NaNs with a different, but often similar, bit
* pattern. However, on some processors merely copying a
* signaling NaN also performs that conversion. In particular,
* copying a signaling NaN to return it to the calling method
* may perform this conversion. So longBitsToDouble
* may not be able to return a double
with a
* signaling NaN bit pattern. Consequently, for some
* long
values,
* doubleToRawLongBits(longBitsToDouble(start))
may
* not equal start
. Moreover, which
* particular bit patterns represent signaling NaNs is platform
* dependent; although all NaN bit patterns, quiet or signaling,
* must be in the NaN range identified above.
*
* @param bits any long
integer.
* @return the double
floating-point value with the same
* bit pattern.
*/
public static native double longBitsToDouble(long bits);
/**
* Compares two Double
objects numerically. There
* are two ways in which comparisons performed by this method
* differ from those performed by the Java language numerical
* comparison operators (<, <=, ==, >= >
)
* when applied to primitive double
values:
*
* This ensures that the natural ordering of
* Double objects imposed by this method is consistent
* with equals.
*
* @param anotherDouble the Double.NaN
is considered by this method
* to be equal to itself and greater than all other
* double
values (including
* Double.POSITIVE_INFINITY
).
* 0.0d
is considered by this method to be greater
* than -0.0d
.
* Double
to be compared.
* @return the value 0
if anotherDouble
is
* numerically equal to this Double
; a value
* less than 0
if this Double
* is numerically less than anotherDouble
;
* and a value greater than 0
if this
* Double
is numerically greater than
* anotherDouble
.
*
* @since 1.2
*/
public int compareTo(Double anotherDouble) {
return Double.compare(value, anotherDouble.value);
}
/**
* Compares the two specified double
values. The sign
* of the integer value returned is the same as that of the
* integer that would be returned by the call:
*
* new Double(d1).compareTo(new Double(d2))
*
*
* @param d1 the first double
to compare
* @param d2 the second double
to compare
* @return the value 0
if d1
is
* numerically equal to d2
; a value less than
* 0
if d1
is numerically less than
* d2
; and a value greater than 0
* if d1
is numerically greater than
* d2
.
* @since 1.4
*/
public static int compare(double d1, double d2) {
if (d1 < d2)
return -1; // Neither val is NaN, thisVal is smaller
if (d1 > d2)
return 1; // Neither val is NaN, thisVal is larger
long thisBits = Double.doubleToLongBits(d1);
long anotherBits = Double.doubleToLongBits(d2);
return (thisBits == anotherBits ? 0 : // Values are equal
(thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
1)); // (0.0, -0.0) or (NaN, !NaN)
}
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -9172774392245257468L;
}