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    /**
77750d24b13461035a89c9af8ec7555588da1cc3d0Elliott Hughes     * Maximum base-2 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    /**
85750d24b13461035a89c9af8ec7555588da1cc3d0Elliott Hughes     * Minimum base-2 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();
101e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes    // Note: Float.TYPE can't be set to "float.class", since *that* is
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // defined to be "java.lang.Float.TYPE";
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the number of bits needed to represent a {@code float} in
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * two's complement form.
107f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
108f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int SIZE = 32;
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code Float} with the specified primitive float value.
114f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the primitive float value to store in the new instance.
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Float(float value) {
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.value = value;
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code Float} with the specified primitive double value.
124f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the primitive double value to store in the new instance.
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Float(double value) {
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.value = (float) value;
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code Float} from the specified string.
134f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a float value.
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
1388890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} can not be parsed as a float value.
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseFloat(String)
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Float(String string) throws NumberFormatException {
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(parseFloat(string));
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares this object to the specified float object to determine their
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * relative order. There are two special cases:
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <ul>
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>{@code Float.NaN} is equal to {@code Float.NaN} and it is greater
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * than any other float value, including {@code Float.POSITIVE_INFINITY};</li>
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>+0.0f is greater than -0.0f</li>
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </ul>
153f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float object to compare this object to.
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a negative value if the value of this float is less than the
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value of {@code object}; 0 if the value of this float and the
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value of {@code object} are equal; a positive value if the value
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         of this float is greater than the value of {@code object}.
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.Comparable
161f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.2
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int compareTo(Float object) {
164f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        return compare(value, object.value);
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte byteValue() {
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (byte) value;
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public double doubleValue() {
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
178438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * Tests this double for equality with {@code object}.
179438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * To be equal, {@code object} must be an instance of {@code Float} and
180438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * {@code floatToIntBits} must give the same value for both objects.
181f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
182438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * <p>Note that, unlike {@code ==}, {@code -0.0} and {@code +0.0} compare
183438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * unequal, and {@code NaN}s compare equal by this method.
184f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare this float with.
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Float}; {@code false} otherwise.
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object object) {
1920d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes        return (object instanceof Float) &&
1930d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes                (floatToIntBits(this.value) == floatToIntBits(((Float) object).value));
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
197dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * Returns an integer corresponding to the bits of the given
198dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * <a href="http://en.wikipedia.org/wiki/IEEE_754-1985">IEEE 754</a> single precision
199dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * float {@code value}. All <em>Not-a-Number (NaN)</em> values are converted to a single NaN
200dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * representation ({@code 0x7fc00000}) (compare to {@link #floatToRawIntBits}).
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
202bbd614097092aab00a97813fa0bdaa10cd3b3f2bIan Rogers    public static int floatToIntBits(float value) {
203bbd614097092aab00a97813fa0bdaa10cd3b3f2bIan Rogers        if (value != value) {
204bbd614097092aab00a97813fa0bdaa10cd3b3f2bIan Rogers            return 0x7fc00000;  // NaN.
205bbd614097092aab00a97813fa0bdaa10cd3b3f2bIan Rogers        } else {
206bbd614097092aab00a97813fa0bdaa10cd3b3f2bIan Rogers            return floatToRawIntBits(value);
207bbd614097092aab00a97813fa0bdaa10cd3b3f2bIan Rogers        }
208bbd614097092aab00a97813fa0bdaa10cd3b3f2bIan Rogers    }
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
211dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * Returns an integer corresponding to the bits of the given
212dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * <a href="http://en.wikipedia.org/wiki/IEEE_754-1985">IEEE 754</a> single precision
213dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * float {@code value}. <em>Not-a-Number (NaN)</em> values are preserved (compare
214dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * to {@link #floatToIntBits}).
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static native int floatToRawIntBits(float value);
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the primitive value of this float.
220f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this object's primitive value.
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public float floatValue() {
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return floatToIntBits(value);
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
234dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * Returns the <a href="http://en.wikipedia.org/wiki/IEEE_754-1985">IEEE 754</a>
235dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * single precision float corresponding to the given {@code bits}.
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static native float intBitsToFloat(int bits);
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int intValue() {
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (int) value;
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this object represents an infinite value.
246f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the value of this float is positive or negative
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         infinity; {@code false} otherwise.
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isInfinite() {
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isInfinite(value);
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the specified float represents an infinite value.
256f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float to check.
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the value of {@code f} is positive or negative
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         infinity; {@code false} otherwise.
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean isInfinite(float f) {
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (f == POSITIVE_INFINITY) || (f == NEGATIVE_INFINITY);
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this object is a <em>Not-a-Number (NaN)</em> value.
268f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this float is <em>Not-a-Number</em>;
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} if it is a (potentially infinite) float number.
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isNaN() {
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isNaN(value);
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the specified float is a <em>Not-a-Number (NaN)</em>
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value.
279f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float value to check.
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if {@code f} is <em>Not-a-Number</em>;
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} if it is a (potentially infinite) float number.
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean isNaN(float f) {
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return f != f;
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long longValue() {
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (long) value;
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a float value.
296f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a float value.
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the primitive float value represented by {@code string}.
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
3018890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} can not be parsed as a float value.
302f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @see #valueOf(String)
303f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.2
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static float parseFloat(String string) throws NumberFormatException {
306dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes        return StringToReal.parseFloat(string);
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public short shortValue() {
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (short) value;
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Float.toString(value);
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a string containing a concise, human-readable description of the
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified float value.
322f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             the float to convert to a string.
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a printable representation of {@code f}.
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toString(float f) {
32810a17e23b22dc0ff6363d15bce67d668b6d44dd0Elliott Hughes        return RealToString.getInstance().floatToString(f);
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a float value.
333f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a float value.
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Float} instance containing the float value represented
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         by {@code string}.
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
3398890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} can not be parsed as a float value.
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseFloat(String)
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Float valueOf(String string) throws NumberFormatException {
343726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return parseFloat(string);
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the two specified float values. There are two special cases:
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <ul>
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>{@code Float.NaN} is equal to {@code Float.NaN} and it is greater
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * than any other float value, including {@code Float.POSITIVE_INFINITY};</li>
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>+0.0f is greater than -0.0f</li>
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </ul>
353f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param float1
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first value to compare.
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param float2
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the second value to compare.
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a negative value if {@code float1} is less than {@code float2};
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         0 if {@code float1} and {@code float2} are equal; a positive
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value if {@code float1} is greater than {@code float2}.
361f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.4
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int compare(float float1, float float2) {
364f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Non-zero, non-NaN checking.
365f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (float1 > float2) {
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 1;
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
368f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (float2 > float1) {
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return -1;
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
371f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (float1 == float2 && 0.0f != float1) {
372f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return 0;
373f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        }
374f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
375f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // NaNs are equal to other NaNs and larger than any other float
376f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (isNaN(float1)) {
377f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            if (isNaN(float2)) {
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return 0;
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
380f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return 1;
381f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        } else if (isNaN(float2)) {
382f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return -1;
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
384f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
385f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Deal with +0.0 and -0.0
386f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        int f1 = floatToRawIntBits(float1);
387f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        int f2 = floatToRawIntBits(float2);
388f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // The below expression is equivalent to:
389f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // (f1 == f2) ? 0 : (f1 < f2) ? -1 : 1
390f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // because f1 and f2 are either 0 or Integer.MIN_VALUE
391f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        return (f1 >> 31) - (f2 >> 31);
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code Float} instance for the specified float value.
396f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float value to store in the instance.
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Float} instance containing {@code f}.
400f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Float valueOf(float f) {
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new Float(f);
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified float into its hexadecimal string representation.
408f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float to convert.
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hexadecimal string representation of {@code f}.
412f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toHexString(float f) {
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /*
416dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes         * Reference: http://en.wikipedia.org/wiki/IEEE_754-1985
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (f != f) {
419f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "NaN";
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (f == POSITIVE_INFINITY) {
422f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "Infinity";
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (f == NEGATIVE_INFINITY) {
425f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "-Infinity";
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int bitValue = floatToIntBits(f);
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean negative = (bitValue & 0x80000000) != 0;
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // mask exponent bits and shift down
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int exponent = (bitValue & 0x7f800000) >>> 23;
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // mask significand bits and shift up
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // significand is 23-bits, so we shift to treat it like 24-bits
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int significand = (bitValue & 0x007FFFFF) << 1;
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (exponent == 0 && significand == 0) {
438f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return (negative ? "-0x0.0p0" : "0x0.0p0");
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        StringBuilder hexString = new StringBuilder(10);
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (negative) {
443f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("-0x");
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
445f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("0x");
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (exponent == 0) { // denormal (subnormal) value
449f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("0.");
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // significand is 23-bits, so there can be 6 hex digits
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int fractionDigits = 6;
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // remove trailing hex zeros, so Integer.toHexString() won't print
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // them
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while ((significand != 0) && ((significand & 0xF) == 0)) {
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                significand >>>= 4;
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fractionDigits--;
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // this assumes Integer.toHexString() returns lowercase characters
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String hexSignificand = Integer.toHexString(significand);
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // if there are digits left, then insert some '0' chars first
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (significand != 0 && fractionDigits > hexSignificand.length()) {
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int digitDiff = fractionDigits - hexSignificand.length();
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while (digitDiff-- != 0) {
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    hexString.append('0');
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hexString.append(hexSignificand);
469f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("p-126");
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else { // normal value
471f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("1.");
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // significand is 23-bits, so there can be 6 hex digits
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int fractionDigits = 6;
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // remove trailing hex zeros, so Integer.toHexString() won't print
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // them
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while ((significand != 0) && ((significand & 0xF) == 0)) {
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                significand >>>= 4;
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fractionDigits--;
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // this assumes Integer.toHexString() returns lowercase characters
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String hexSignificand = Integer.toHexString(significand);
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // if there are digits left, then insert some '0' chars first
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (significand != 0 && fractionDigits > hexSignificand.length()) {
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int digitDiff = fractionDigits - hexSignificand.length();
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while (digitDiff-- != 0) {
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    hexString.append('0');
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hexString.append(hexSignificand);
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hexString.append('p');
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // remove exponent's 'bias' and convert to a string
49382a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes            hexString.append(exponent - 127);
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hexString.toString();
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
498