/*
* @(#)Float.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.FloatConsts;
import sun.misc.DoubleConsts;
/**
* The Float
class wraps a value of primitive type
* float
in an object. An object of type
* Float
contains a single field whose type is
* float
.
*
* 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 f the float to be converted.
* @return a string representation of the argument.
*/
public static String toString(float f) {
return new FloatingDecimal(f).toJavaFormatString();
}
/**
* Returns a hexadecimal string representation of 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 31 (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 an integer that, when given to the
* {@link #intBitsToFloat(int)} method, will produce a floating-point
* value the same as the argument to
* Bit 31 (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 integer representing
* the actual NaN value. Unlike the
* In all cases, the result is an integer that, when given to the
* {@link #intBitsToFloat(int)} method, will produce a
* floating-point value the same as the argument to
*
* 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
* float
to a String
and a
* String
to a float
, as well as other
* constants and methods useful when dealing with a
* float
.
*
* @author Lee Boynton
* @author Arthur van Hoff
* @author Joseph D. Darcy
* @version 1.94, 05/11/04
* @since JDK1.0
*/
public final class Float extends Number implements Comparablefloat
. It is equal to the value returned by
* Float.intBitsToFloat(0x7f800000)
.
*/
public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
/**
* A constant holding the negative infinity of type
* float
. It is equal to the value returned by
* Float.intBitsToFloat(0xff800000)
.
*/
public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;
/**
* A constant holding a Not-a-Number (NaN) value of type
* float
. It is equivalent to the value returned by
* Float.intBitsToFloat(0x7fc00000)
.
*/
public static final float NaN = 0.0f / 0.0f;
/**
* A constant holding the largest positive finite value of type
* float
, (2-2-23)·2127.
* It is equal to the hexadecimal floating-point literal
* 0x1.fffffeP+127f
and also equal to
* Float.intBitsToFloat(0x7f7fffff)
.
*/
public static final float MAX_VALUE = 3.4028235e+38f; // 0x1.fffffeP+127f
/**
* A constant holding the smallest positive nonzero value of type
* float
, 2-149. It is equal to the
* hexadecimal floating-point literal 0x0.000002P-126f
* and also equal to Float.intBitsToFloat(0x1)
.
*/
public static final float MIN_VALUE = 1.4e-45f; // 0x0.000002P-126f
/**
* The number of bits used to represent a float value.
*
* @since 1.5
*/
public static final int SIZE = 32;
/**
* The Class
instance representing the primitive type
* float
.
*
* @since JDK1.1
*/
public static final Classfloat
* 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
* java.lang.Integer#toString(int)}
.
* float
. That is, suppose that x is the
* exact mathematical value represented by the decimal
* representation produced by this method for a finite nonzero
* argument f. Then f must be the float
* value nearest to x; or, if two float
values are
* equally close to x, then f must be one of
* them and the least significant bit of the significand of
* f must be 0
.
* float
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"
.
*
* float
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.
*
* float
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-126"
. Note that there must be at
* least one nonzero digit in a subnormal significand.
*
*
*
* @param f 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
* Float.MAX_VALUE
* 0x1.fffffep127
* Minimum Normal Value
* 0x1.0p-126
* Maximum Subnormal Value
* 0x0.fffffep-126
* Float.MIN_VALUE
* 0x0.000002p-126
float
to be converted.
* @return a hex string representation of the argument.
* @since 1.5
* @author Joseph D. Darcy
*/
public static String toHexString(float f) {
if (Math.abs(f) < FloatConsts.MIN_NORMAL
&& f != 0.0f ) {// float subnormal
// Adjust exponent to create subnormal double, then
// replace subnormal double exponent with subnormal float
// exponent
String s = Double.toHexString(FpUtils.scalb((double)f,
/* -1022+126 */
DoubleConsts.MIN_EXPONENT-
FloatConsts.MIN_EXPONENT));
return s.replaceFirst("p-1022$", "p-126");
}
else // double string will be the same as float string
return Double.toHexString(f);
}
/**
* Returns a Float
object holding the
* float
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 float
* by the usual round-to-nearest rule of IEEE 754 floating-point
* arithmetic, which includes preserving the sign of a zero
* value. Finally, a Float
object representing this
* float
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. In general, the
* two-step sequence of conversions, string to double
* followed by double
to float
, is
* not equivalent to converting a string directly to
* float
. For example, if first converted to an
* intermediate double
and then to
* float
, the string
* "1.00000017881393421514957253748434595763683319091796875001d"
* results in the float
value
* 1.0000002f
; if the string is converted directly to
* float
, 1.0000001f
results.
*
* NumberFormatException
be thrown, the documentation
* for {@link Double#valueOf Double.valueOf} lists a regular
* expression which can be used to screen the input.
*
* @param s the string to be parsed.
* @return a Float
object holding the value
* represented by the String
argument.
* @exception NumberFormatException if the string does not contain a
* parsable number.
*/
public static Float valueOf(String s) throws NumberFormatException {
return new Float(FloatingDecimal.readJavaFormatString(s).floatValue());
}
/**
* Returns a Float instance representing the specified
* float value.
* If a new Float instance is not required, this method
* should generally be used in preference to the constructor
* {@link #Float(float)}, as this method is likely to yield
* significantly better space and time performance by caching
* frequently requested values.
*
* @param f a float value.
* @return a Float instance representing f.
* @since 1.5
*/
public static Float valueOf(float f) {
return new Float(f);
}
/**
* Returns a new float
initialized to the value
* represented by the specified String
, as performed
* by the valueOf
method of class Float
.
*
* @param s the string to be parsed.
* @return the float
value represented by the string
* argument.
* @exception NumberFormatException if the string does not contain a
* parsable float
.
* @see java.lang.Float#valueOf(String)
* @since 1.2
*/
public static float parseFloat(String s) throws NumberFormatException {
return FloatingDecimal.readJavaFormatString(s).floatValue();
}
/**
* 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 argument is NaN;
* false
otherwise.
*/
static public boolean isNaN(float 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 argument is positive infinity or
* negative infinity; false
otherwise.
*/
static public boolean isInfinite(float v) {
return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
}
/**
* The value of the Float.
*
* @serial
*/
private final float value;
/**
* Constructs a newly allocated Float
object that
* represents the primitive float
argument.
*
* @param value the value to be represented by the Float
.
*/
public Float(float value) {
this.value = value;
}
/**
* Constructs a newly allocated Float
object that
* represents the argument converted to type float
.
*
* @param value the value to be represented by the Float
.
*/
public Float(double value) {
this.value = (float)value;
}
/**
* Constructs a newly allocated Float
object that
* represents the floating-point value of type float
* represented by the string. The string is converted to a
* float
value as if by the valueOf
method.
*
* @param s a string to be converted to a Float
.
* @exception NumberFormatException if the string does not contain a
* parsable number.
* @see java.lang.Float#valueOf(java.lang.String)
*/
public Float(String s) throws NumberFormatException {
// REMIND: this is inefficient
this(valueOf(s).floatValue());
}
/**
* Returns true
if this Float
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 Float
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 Float
object.
* The primitive float
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.Float#toString(float)
*/
public String toString() {
return String.valueOf(value);
}
/**
* Returns the value of this Float
as a
* byte
(by casting to a byte
).
*
* @return the float
value represented by this object
* converted to type byte
*/
public byte byteValue() {
return (byte)value;
}
/**
* Returns the value of this Float
as a
* short
(by casting to a short
).
*
* @return the float
value represented by this object
* converted to type short
* @since JDK1.1
*/
public short shortValue() {
return (short)value;
}
/**
* Returns the value of this Float
as an
* int
(by casting to type int
).
*
* @return the float
value represented by this object
* converted to type int
*/
public int intValue() {
return (int)value;
}
/**
* Returns value of this Float
as a long
* (by casting to type long
).
*
* @return the float
value represented by this object
* converted to type long
*/
public long longValue() {
return (long)value;
}
/**
* Returns the float
value of this Float
* object.
*
* @return the float
value represented by this object
*/
public float floatValue() {
return value;
}
/**
* Returns the double
value of this
* Float
object.
*
* @return the float
value represented by this
* object is converted to type double
and the
* result of the conversion is returned.
*/
public double doubleValue() {
return (double)value;
}
/**
* Returns a hash code for this Float
object. The
* result is the integer bit representation, exactly as produced
* by the method {@link #floatToIntBits(float)}, of the primitive
* float
value represented by this Float
* object.
*
* @return a hash code value for this object.
*/
public int hashCode() {
return floatToIntBits(value);
}
/**
* Compares this object against the specified object. The result
* is true
if and only if the argument is not
* null
and is a Float
object that
* represents a float
with the same value as the
* float
represented by this object. For this
* purpose, two float
values are considered to be the
* same if and only if the method {@link #floatToIntBits(float)}
* returns the identical int
value when applied to
* each.
* Float
, f1
and f2
, the value
* of f1.equals(f2)
is true
if and only if
*
*
* f1.floatValue() == f2.floatValue()
*
true
. However, there are two exceptions:
*
*
* This definition allows hash tables to operate properly.
*
* @param obj the object to be compared
* @return f1
and f2
both represent
* Float.NaN
, then the equals
method returns
* true
, even though Float.NaN==Float.NaN
* has the value false
.
* f1
represents +0.0f
while
* f2
represents -0.0f
, or vice
* versa, the equal
test has the value
* false
, even though 0.0f==-0.0f
* has the value true
.
* true
if the objects are the same;
* false
otherwise.
* @see java.lang.Float#floatToIntBits(float)
*/
public boolean equals(Object obj) {
return (obj instanceof Float)
&& (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}
/**
* Returns a representation of the specified floating-point value
* according to the IEEE 754 floating-point "single format" bit
* layout.
* 0x80000000
) represents the sign of the floating-point
* number.
* Bits 30-23 (the bits that are selected by the mask
* 0x7f800000
) represent the exponent.
* Bits 22-0 (the bits that are selected by the mask
* 0x007fffff
) represent the significand (sometimes called
* the mantissa) of the floating-point number.
* 0x7f800000
.
* 0xff800000
.
* 0x7fc00000
.
* floatToIntBits
* (except all NaN values are collapsed to a single
* "canonical" NaN value).
*
* @param value a floating-point number.
* @return the bits that represent the floating-point number.
*/
public static native int floatToIntBits(float value);
/**
* Returns a representation of the specified floating-point value
* according to the IEEE 754 floating-point "single format" bit
* layout, preserving Not-a-Number (NaN) values.
* 0x80000000
) represents the sign of the floating-point
* number.
* Bits 30-23 (the bits that are selected by the mask
* 0x7f800000
) represent the exponent.
* Bits 22-0 (the bits that are selected by the mask
* 0x007fffff
) represent the significand (sometimes called
* the mantissa) of the floating-point number.
* 0x7f800000
.
* 0xff800000
.
* floatToIntBits
* method, intToRawIntBits
does not collapse all the
* bit patterns encoding a NaN to a single "canonical"
* NaN value.
* floatToRawIntBits
.
* @param value a floating-point number.
* @return the bits that represent the floating-point number.
*/
public static native int floatToRawIntBits(float value);
/**
* Returns the float
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
* "single format" bit layout.
* 0x7f800000
, the result is positive
* infinity.
* 0xff800000
, the result is negative
* infinity.
* 0x7f800001
through 0x7fffffff
or in
* the range 0xff800001
through
* 0xffffffff
, 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 Float.floatToRawIntBits
method.
*
* Then the floating-point result equals the value of the mathematical
* expression s·m·2e-150.
*
* int s = ((bits >> 31) == 0) ? 1 : -1;
* int e = ((bits >> 23) & 0xff);
* int m = (e == 0) ?
* (bits & 0x7fffff) << 1 :
* (bits & 0x7fffff) | 0x800000;
*
float
NaN with exactly same bit pattern as the
* int
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 intBitsToFloat
may
* not be able to return a float
with a signaling NaN
* bit pattern. Consequently, for some int
values,
* floatToRawIntBits(intBitsToFloat(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 an integer.
* @return the float
floating-point value with the same bit
* pattern.
*/
public static native float intBitsToFloat(int bits);
/**
* Compares two Float
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 float
values:
*
* This ensures that the natural ordering of Float
* objects imposed by this method is consistent with equals.
*
* @param anotherFloat the Float.NaN
is considered by this method to
* be equal to itself and greater than all other
* float
values
* (including Float.POSITIVE_INFINITY
).
* 0.0f
is considered by this method to be greater
* than -0.0f
.
* Float
to be compared.
* @return the value 0
if anotherFloat
is
* numerically equal to this Float
; a value
* less than 0
if this Float
* is numerically less than anotherFloat
;
* and a value greater than 0
if this
* Float
is numerically greater than
* anotherFloat
.
*
* @since 1.2
* @see Comparable#compareTo(Object)
*/
public int compareTo(Float anotherFloat) {
return Float.compare(value, anotherFloat.value);
}
/**
* Compares the two specified float
values. The sign
* of the integer value returned is the same as that of the
* integer that would be returned by the call:
*
* new Float(f1).compareTo(new Float(f2))
*
*
* @param f1 the first float
to compare.
* @param f2 the second float
to compare.
* @return the value 0
if f1
is
* numerically equal to f2
; a value less than
* 0
if f1
is numerically less than
* f2
; and a value greater than 0
* if f1
is numerically greater than
* f2
.
* @since 1.4
*/
public static int compare(float f1, float f2) {
if (f1 < f2)
return -1; // Neither val is NaN, thisVal is smaller
if (f1 > f2)
return 1; // Neither val is NaN, thisVal is larger
int thisBits = Float.floatToIntBits(f1);
int anotherBits = Float.floatToIntBits(f2);
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 = -2671257302660747028L;
}