Float.java revision 706de1164836051ab31cc69eb77a6bba1a723896
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.lang;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The wrapper for the primitive type {@code float}.
22f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.lang.Number
24f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.0
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic final class Float extends Number implements Comparable<Float> {
27706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes    static final int EXPONENT_BIAS = 127;
28706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes
29706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes    static final int EXPONENT_BITS = 9;
30706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes    static final int MANTISSA_BITS = 23;
31706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes    static final int NON_MANTISSA_BITS = 9;
32706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes
33706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes    static final int SIGN_MASK     = 0x80000000;
34706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes    static final int EXPONENT_MASK = 0x7f800000;
35706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes    static final int MANTISSA_MASK = 0x007fffff;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = -2671257302660747028L;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The value which the receiver represents.
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final float value;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the maximum {@code float} value, (2 - 2<sup>-23</sup>) * 2<sup>127</sup>.
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final float MAX_VALUE = 3.40282346638528860e+38f;
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the minimum {@code float} value, 2<sup>-149</sup>.
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final float MIN_VALUE = 1.40129846432481707e-45f;
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the Not-a-Number (NaN) value of the {@code float} type.
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final float NaN = 0.0f / 0.0f;
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
60b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * Constant for the positive infinity value of the {@code float} type.
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
65b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * Constant for the negative infinity value of the {@code float} type.
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
70b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * Constant for the smallest positive normal value of the {@code float} type.
71f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
72b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * @since 1.6
73b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     */
74b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes    public static final float MIN_NORMAL = 1.1754943508222875E-38f;
75b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes
76b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes    /**
77b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * Maximum exponent that a finite value of the {@code float} type may have.
78b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * Equal to {@code Math.getExponent(Float.MAX_VALUE)}.
79f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
80b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * @since 1.6
81b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     */
82b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes    public static final int MAX_EXPONENT = 127;
83b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes
84b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes    /**
85b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * Minimum exponent that a normal value of the {@code float} type may have.
86b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * Equal to {@code Math.getExponent(Float.MIN_NORMAL)}.
87f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
88b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * @since 1.6
89b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     */
90b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes    public static final int MIN_EXPONENT = -126;
91b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes
92b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes    /**
93f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * The {@link Class} object that represents the primitive type {@code
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * float}.
95f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
96f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.1
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
99726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static final Class<Float> TYPE
100726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            = (Class<Float>) float[].class.getComponentType();
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Note: This can't be set to "float.class", since *that* is
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // defined to be "java.lang.Float.TYPE";
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the number of bits needed to represent a {@code float} in
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * two's complement form.
108f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
109f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int SIZE = 32;
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code Float} with the specified primitive float value.
115f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the primitive float value to store in the new instance.
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Float(float value) {
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.value = value;
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code Float} with the specified primitive double value.
125f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the primitive double value to store in the new instance.
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Float(double value) {
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.value = (float) value;
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code Float} from the specified string.
135f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a float value.
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code string} can not be decoded into a float value.
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseFloat(String)
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Float(String string) throws NumberFormatException {
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(parseFloat(string));
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares this object to the specified float object to determine their
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * relative order. There are two special cases:
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <ul>
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>{@code Float.NaN} is equal to {@code Float.NaN} and it is greater
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * than any other float value, including {@code Float.POSITIVE_INFINITY};</li>
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>+0.0f is greater than -0.0f</li>
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </ul>
154f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float object to compare this object to.
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a negative value if the value of this float is less than the
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value of {@code object}; 0 if the value of this float and the
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value of {@code object} are equal; a positive value if the value
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         of this float is greater than the value of {@code object}.
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.Comparable
162f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.2
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int compareTo(Float object) {
165f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        return compare(value, object.value);
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte byteValue() {
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (byte) value;
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public double doubleValue() {
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
179438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * Tests this double for equality with {@code object}.
180438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * To be equal, {@code object} must be an instance of {@code Float} and
181438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * {@code floatToIntBits} must give the same value for both objects.
182f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
183438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * <p>Note that, unlike {@code ==}, {@code -0.0} and {@code +0.0} compare
184438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * unequal, and {@code NaN}s compare equal by this method.
185f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare this float with.
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Float}; {@code false} otherwise.
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object object) {
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (object == this)
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                || (object instanceof Float)
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && (floatToIntBits(this.value) == floatToIntBits(((Float) object).value));
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified float value to a binary representation conforming
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the IEEE 754 floating-point single precision bit layout. All
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <em>Not-a-Number (NaN)</em> values are converted to a single NaN
2027023c8ff547217ec58f062255a850e54bfefc681Elliott Hughes     * representation ({@code 0x7fc00000}).
203f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float value to convert.
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the IEEE 754 floating-point single precision representation of
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code value}.
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #floatToRawIntBits(float)
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #intBitsToFloat(int)
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static native int floatToIntBits(float value);
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified float value to a binary representation conforming
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the IEEE 754 floating-point single precision bit layout.
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <em>Not-a-Number (NaN)</em> values are preserved.
217f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float value to convert.
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the IEEE 754 floating-point single precision representation of
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code value}.
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #floatToIntBits(float)
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #intBitsToFloat(int)
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static native int floatToRawIntBits(float value);
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the primitive value of this float.
229f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this object's primitive value.
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public float floatValue() {
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return floatToIntBits(value);
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified IEEE 754 floating-point single precision bit
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * pattern to a Java float value.
245f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param bits
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the IEEE 754 floating-point single precision representation of
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            a float value.
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the float value converted from {@code bits}.
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #floatToIntBits(float)
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #floatToRawIntBits(float)
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static native float intBitsToFloat(int bits);
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int intValue() {
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (int) value;
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this object represents an infinite value.
262f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the value of this float is positive or negative
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         infinity; {@code false} otherwise.
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isInfinite() {
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isInfinite(value);
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the specified float represents an infinite value.
272f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float to check.
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the value of {@code f} is positive or negative
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         infinity; {@code false} otherwise.
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean isInfinite(float f) {
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (f == POSITIVE_INFINITY) || (f == NEGATIVE_INFINITY);
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this object is a <em>Not-a-Number (NaN)</em> value.
284f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this float is <em>Not-a-Number</em>;
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} if it is a (potentially infinite) float number.
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isNaN() {
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isNaN(value);
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the specified float is a <em>Not-a-Number (NaN)</em>
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value.
295f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float value to check.
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if {@code f} is <em>Not-a-Number</em>;
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} if it is a (potentially infinite) float number.
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean isNaN(float f) {
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return f != f;
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long longValue() {
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (long) value;
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a float value.
312f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a float value.
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the primitive float value represented by {@code string}.
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code string} is {@code null}, has a length of zero or
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             can not be parsed as a float value.
319f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @see #valueOf(String)
320f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.2
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static float parseFloat(String string) throws NumberFormatException {
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return org.apache.harmony.luni.util.FloatingPointParser
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .parseFloat(string);
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public short shortValue() {
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (short) value;
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Float.toString(value);
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a string containing a concise, human-readable description of the
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified float value.
340f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             the float to convert to a string.
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a printable representation of {@code f}.
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toString(float f) {
346706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes        return new RealToString().floatToString(f);
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a float value.
351f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a float value.
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Float} instance containing the float value represented
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         by {@code string}.
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code string} is {@code null}, has a length of zero or
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             can not be parsed as a float value.
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseFloat(String)
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Float valueOf(String string) throws NumberFormatException {
362726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return parseFloat(string);
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the two specified float values. There are two special cases:
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <ul>
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>{@code Float.NaN} is equal to {@code Float.NaN} and it is greater
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * than any other float value, including {@code Float.POSITIVE_INFINITY};</li>
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>+0.0f is greater than -0.0f</li>
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </ul>
372f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param float1
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first value to compare.
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param float2
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the second value to compare.
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a negative value if {@code float1} is less than {@code float2};
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         0 if {@code float1} and {@code float2} are equal; a positive
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value if {@code float1} is greater than {@code float2}.
380f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.4
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int compare(float float1, float float2) {
383f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Non-zero, non-NaN checking.
384f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (float1 > float2) {
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 1;
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
387f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (float2 > float1) {
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return -1;
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
390f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (float1 == float2 && 0.0f != float1) {
391f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return 0;
392f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        }
393f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
394f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // NaNs are equal to other NaNs and larger than any other float
395f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (isNaN(float1)) {
396f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            if (isNaN(float2)) {
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return 0;
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
399f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return 1;
400f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        } else if (isNaN(float2)) {
401f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return -1;
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
403f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
404f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Deal with +0.0 and -0.0
405f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        int f1 = floatToRawIntBits(float1);
406f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        int f2 = floatToRawIntBits(float2);
407f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // The below expression is equivalent to:
408f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // (f1 == f2) ? 0 : (f1 < f2) ? -1 : 1
409f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // because f1 and f2 are either 0 or Integer.MIN_VALUE
410f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        return (f1 >> 31) - (f2 >> 31);
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code Float} instance for the specified float value.
415f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float value to store in the instance.
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Float} instance containing {@code f}.
419f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Float valueOf(float f) {
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new Float(f);
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified float into its hexadecimal string representation.
427f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float to convert.
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hexadecimal string representation of {@code f}.
431f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toHexString(float f) {
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /*
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Reference: http://en.wikipedia.org/wiki/IEEE_754
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (f != f) {
438f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "NaN";
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (f == POSITIVE_INFINITY) {
441f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "Infinity";
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (f == NEGATIVE_INFINITY) {
444f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "-Infinity";
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int bitValue = floatToIntBits(f);
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean negative = (bitValue & 0x80000000) != 0;
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // mask exponent bits and shift down
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int exponent = (bitValue & 0x7f800000) >>> 23;
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // mask significand bits and shift up
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // significand is 23-bits, so we shift to treat it like 24-bits
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int significand = (bitValue & 0x007FFFFF) << 1;
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (exponent == 0 && significand == 0) {
457f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return (negative ? "-0x0.0p0" : "0x0.0p0");
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        StringBuilder hexString = new StringBuilder(10);
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (negative) {
462f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("-0x");
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
464f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("0x");
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (exponent == 0) { // denormal (subnormal) value
468f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("0.");
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // significand is 23-bits, so there can be 6 hex digits
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int fractionDigits = 6;
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // remove trailing hex zeros, so Integer.toHexString() won't print
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // them
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while ((significand != 0) && ((significand & 0xF) == 0)) {
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                significand >>>= 4;
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fractionDigits--;
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // this assumes Integer.toHexString() returns lowercase characters
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String hexSignificand = Integer.toHexString(significand);
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // if there are digits left, then insert some '0' chars first
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (significand != 0 && fractionDigits > hexSignificand.length()) {
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int digitDiff = fractionDigits - hexSignificand.length();
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while (digitDiff-- != 0) {
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    hexString.append('0');
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hexString.append(hexSignificand);
488f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("p-126");
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else { // normal value
490f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("1.");
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // significand is 23-bits, so there can be 6 hex digits
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int fractionDigits = 6;
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // remove trailing hex zeros, so Integer.toHexString() won't print
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // them
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while ((significand != 0) && ((significand & 0xF) == 0)) {
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                significand >>>= 4;
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fractionDigits--;
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // this assumes Integer.toHexString() returns lowercase characters
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String hexSignificand = Integer.toHexString(significand);
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // if there are digits left, then insert some '0' chars first
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (significand != 0 && fractionDigits > hexSignificand.length()) {
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int digitDiff = fractionDigits - hexSignificand.length();
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while (digitDiff-- != 0) {
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    hexString.append('0');
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hexString.append(hexSignificand);
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hexString.append('p');
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // remove exponent's 'bias' and convert to a string
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hexString.append(Integer.toString(exponent - 127));
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hexString.toString();
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
517