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     */
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static native int floatToIntBits(float value);
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
205dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * Returns an integer corresponding to the bits of the given
206dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * <a href="http://en.wikipedia.org/wiki/IEEE_754-1985">IEEE 754</a> single precision
207dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * float {@code value}. <em>Not-a-Number (NaN)</em> values are preserved (compare
208dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * to {@link #floatToIntBits}).
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static native int floatToRawIntBits(float value);
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the primitive value of this float.
214f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this object's primitive value.
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public float floatValue() {
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return floatToIntBits(value);
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
228dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * Returns the <a href="http://en.wikipedia.org/wiki/IEEE_754-1985">IEEE 754</a>
229dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * single precision float corresponding to the given {@code bits}.
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static native float intBitsToFloat(int bits);
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int intValue() {
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (int) value;
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this object represents an infinite value.
240f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the value of this float is positive or negative
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         infinity; {@code false} otherwise.
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isInfinite() {
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isInfinite(value);
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the specified float represents an infinite value.
250f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float to check.
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the value of {@code f} is positive or negative
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         infinity; {@code false} otherwise.
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean isInfinite(float f) {
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (f == POSITIVE_INFINITY) || (f == NEGATIVE_INFINITY);
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this object is a <em>Not-a-Number (NaN)</em> value.
262f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this float is <em>Not-a-Number</em>;
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} if it is a (potentially infinite) float number.
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isNaN() {
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isNaN(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 is a <em>Not-a-Number (NaN)</em>
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value.
273f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float value to check.
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if {@code f} is <em>Not-a-Number</em>;
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} if it is a (potentially infinite) float number.
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean isNaN(float f) {
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return f != f;
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long longValue() {
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (long) value;
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a float value.
290f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a float value.
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the primitive float value represented by {@code string}.
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
2958890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} can not be parsed as a float value.
296f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @see #valueOf(String)
297f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.2
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static float parseFloat(String string) throws NumberFormatException {
300dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes        return StringToReal.parseFloat(string);
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public short shortValue() {
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (short) value;
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Float.toString(value);
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a string containing a concise, human-readable description of the
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified float value.
316f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             the float to convert to a string.
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a printable representation of {@code f}.
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toString(float f) {
32210a17e23b22dc0ff6363d15bce67d668b6d44dd0Elliott Hughes        return RealToString.getInstance().floatToString(f);
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a float value.
327f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a float value.
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Float} instance containing the float value represented
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         by {@code string}.
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
3338890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} can not be parsed as a float value.
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseFloat(String)
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Float valueOf(String string) throws NumberFormatException {
337726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return parseFloat(string);
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the two specified float values. There are two special cases:
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <ul>
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>{@code Float.NaN} is equal to {@code Float.NaN} and it is greater
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * than any other float value, including {@code Float.POSITIVE_INFINITY};</li>
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>+0.0f is greater than -0.0f</li>
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </ul>
347f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param float1
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first value to compare.
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param float2
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the second value to compare.
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a negative value if {@code float1} is less than {@code float2};
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         0 if {@code float1} and {@code float2} are equal; a positive
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value if {@code float1} is greater than {@code float2}.
355f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.4
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int compare(float float1, float float2) {
358f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Non-zero, non-NaN checking.
359f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (float1 > float2) {
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 1;
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
362f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (float2 > float1) {
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return -1;
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
365f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (float1 == float2 && 0.0f != float1) {
366f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return 0;
367f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        }
368f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
369f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // NaNs are equal to other NaNs and larger than any other float
370f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (isNaN(float1)) {
371f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            if (isNaN(float2)) {
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return 0;
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
374f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return 1;
375f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        } else if (isNaN(float2)) {
376f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return -1;
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
378f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
379f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Deal with +0.0 and -0.0
380f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        int f1 = floatToRawIntBits(float1);
381f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        int f2 = floatToRawIntBits(float2);
382f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // The below expression is equivalent to:
383f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // (f1 == f2) ? 0 : (f1 < f2) ? -1 : 1
384f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // because f1 and f2 are either 0 or Integer.MIN_VALUE
385f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        return (f1 >> 31) - (f2 >> 31);
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code Float} instance for the specified float value.
390f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float value to store in the instance.
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Float} instance containing {@code f}.
394f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Float valueOf(float f) {
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new Float(f);
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified float into its hexadecimal string representation.
402f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param f
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the float to convert.
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hexadecimal string representation of {@code f}.
406f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toHexString(float f) {
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /*
410dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes         * Reference: http://en.wikipedia.org/wiki/IEEE_754-1985
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (f != f) {
413f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "NaN";
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (f == POSITIVE_INFINITY) {
416f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "Infinity";
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (f == NEGATIVE_INFINITY) {
419f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "-Infinity";
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int bitValue = floatToIntBits(f);
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean negative = (bitValue & 0x80000000) != 0;
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // mask exponent bits and shift down
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int exponent = (bitValue & 0x7f800000) >>> 23;
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // mask significand bits and shift up
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // significand is 23-bits, so we shift to treat it like 24-bits
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int significand = (bitValue & 0x007FFFFF) << 1;
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (exponent == 0 && significand == 0) {
432f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return (negative ? "-0x0.0p0" : "0x0.0p0");
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        StringBuilder hexString = new StringBuilder(10);
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (negative) {
437f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("-0x");
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
439f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("0x");
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (exponent == 0) { // denormal (subnormal) value
443f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("0.");
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // significand is 23-bits, so there can be 6 hex digits
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int fractionDigits = 6;
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // remove trailing hex zeros, so Integer.toHexString() won't print
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // them
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while ((significand != 0) && ((significand & 0xF) == 0)) {
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                significand >>>= 4;
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fractionDigits--;
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // this assumes Integer.toHexString() returns lowercase characters
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String hexSignificand = Integer.toHexString(significand);
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // if there are digits left, then insert some '0' chars first
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (significand != 0 && fractionDigits > hexSignificand.length()) {
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int digitDiff = fractionDigits - hexSignificand.length();
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while (digitDiff-- != 0) {
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    hexString.append('0');
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hexString.append(hexSignificand);
463f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("p-126");
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else { // normal value
465f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("1.");
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // significand is 23-bits, so there can be 6 hex digits
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int fractionDigits = 6;
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // remove trailing hex zeros, so Integer.toHexString() won't print
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // them
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while ((significand != 0) && ((significand & 0xF) == 0)) {
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                significand >>>= 4;
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fractionDigits--;
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // this assumes Integer.toHexString() returns lowercase characters
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String hexSignificand = Integer.toHexString(significand);
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // if there are digits left, then insert some '0' chars first
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (significand != 0 && fractionDigits > hexSignificand.length()) {
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int digitDiff = fractionDigits - hexSignificand.length();
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while (digitDiff-- != 0) {
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    hexString.append('0');
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hexString.append(hexSignificand);
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hexString.append('p');
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // remove exponent's 'bias' and convert to a string
48782a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes            hexString.append(exponent - 127);
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hexString.toString();
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
492