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 double}.
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 Double extends Number implements Comparable<Double> {
27706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes    static final int EXPONENT_BIAS = 1023;
28706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes
29706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes    static final int EXPONENT_BITS = 12;
30706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes    static final int MANTISSA_BITS = 52;
31706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes    static final int NON_MANTISSA_BITS = 12;
32706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes
33706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes    static final long SIGN_MASK     = 0x8000000000000000L;
34706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes    static final long EXPONENT_MASK = 0x7ff0000000000000L;
35706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes    static final long MANTISSA_MASK = 0x000fffffffffffffL;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = -9172774392245257468L;
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 double value;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the maximum {@code double} value, (2 - 2<sup>-52</sup>) *
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 2<sup>1023</sup>.
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final double MAX_VALUE = 1.79769313486231570e+308;
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the minimum {@code double} value, 2<sup>-1074</sup>.
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final double MIN_VALUE = 5e-324;
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /* 4.94065645841246544e-324 gets rounded to 9.88131e-324 */
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the Not-a-Number (NaN) value of the {@code double} type.
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final double NaN = 0.0 / 0.0;
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
63b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * Constant for the positive infinity value of the {@code double} type.
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final double POSITIVE_INFINITY = 1.0 / 0.0;
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
68b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * Constant for the negative infinity value of the {@code double} type.
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
73b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * Constant for the smallest positive normal value of the {@code double} type.
74f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
75b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * @since 1.6
76b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     */
77b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes    public static final double MIN_NORMAL = 2.2250738585072014E-308;
78b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes
79b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes    /**
80750d24b13461035a89c9af8ec7555588da1cc3d0Elliott Hughes     * Maximum base-2 exponent that a finite value of the {@code double} type may have.
81b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * Equal to {@code Math.getExponent(Double.MAX_VALUE)}.
82f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
83b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * @since 1.6
84b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     */
85b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes    public static final int MAX_EXPONENT = 1023;
86b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes
87b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes    /**
88750d24b13461035a89c9af8ec7555588da1cc3d0Elliott Hughes     * Minimum base-2 exponent that a normal value of the {@code double} type may have.
89b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * Equal to {@code Math.getExponent(Double.MIN_NORMAL)}.
90f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
91b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     * @since 1.6
92b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes     */
93b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes    public static final int MIN_EXPONENT = -1022;
94b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes
95b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes    /**
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The {@link Class} object that represents the primitive type {@code
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * double}.
98f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
99f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.1
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
102726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static final Class<Double> TYPE
103726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            = (Class<Double>) double[].class.getComponentType();
104e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes    // Note: Double.TYPE can't be set to "double.class", since *that* is
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // defined to be "java.lang.Double.TYPE";
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the number of bits needed to represent a {@code double} in
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * two's complement form.
110f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
111f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int SIZE = 64;
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code Double} with the specified primitive double
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value.
118f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the primitive double value to store in the new instance.
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Double(double value) {
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.value = value;
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code Double} from the specified string.
128f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a double value.
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
1328890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a double value.
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseDouble(String)
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Double(String string) throws NumberFormatException {
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(parseDouble(string));
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares this object to the specified double object to determine their
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * relative order. There are two special cases:
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <ul>
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>{@code Double.NaN} is equal to {@code Double.NaN} and it is greater
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * than any other double value, including {@code Double.POSITIVE_INFINITY};</li>
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>+0.0d is greater than -0.0d</li>
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </ul>
147f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the double object to compare this object to.
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a negative value if the value of this double is less than the
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value of {@code object}; 0 if the value of this double and the
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value of {@code object} are equal; a positive value if the value
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         of this double is greater than the value of {@code object}.
154f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws NullPointerException
155f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if {@code object} is {@code null}.
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.Comparable
157f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.2
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int compareTo(Double object) {
160f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        return compare(value, object.value);
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte byteValue() {
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (byte) value;
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
169dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * Returns an integer corresponding to the bits of the given
170dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * <a href="http://en.wikipedia.org/wiki/IEEE_754-1985">IEEE 754</a> double precision
171dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * {@code value}. All <em>Not-a-Number (NaN)</em> values are converted to a single NaN
172dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * representation ({@code 0x7ff8000000000000L}) (compare to {@link #doubleToRawLongBits}).
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
174bbd614097092aab00a97813fa0bdaa10cd3b3f2bIan Rogers    public static long doubleToLongBits(double value) {
175bbd614097092aab00a97813fa0bdaa10cd3b3f2bIan Rogers        if (value != value) {
176bbd614097092aab00a97813fa0bdaa10cd3b3f2bIan Rogers            return 0x7ff8000000000000L;  // NaN.
177bbd614097092aab00a97813fa0bdaa10cd3b3f2bIan Rogers        } else {
178bbd614097092aab00a97813fa0bdaa10cd3b3f2bIan Rogers            return doubleToRawLongBits(value);
179bbd614097092aab00a97813fa0bdaa10cd3b3f2bIan Rogers        }
180bbd614097092aab00a97813fa0bdaa10cd3b3f2bIan Rogers    }
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
183dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * Returns an integer corresponding to the bits of the given
184dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * <a href="http://en.wikipedia.org/wiki/IEEE_754-1985">IEEE 754</a> double precision
185dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * {@code value}. <em>Not-a-Number (NaN)</em> values are preserved (compare
186dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * to {@link #doubleToLongBits}).
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static native long doubleToRawLongBits(double value);
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the primitive value of this double.
192f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this object's primitive value.
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public double doubleValue() {
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
201438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * Tests this double for equality with {@code object}.
202438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * To be equal, {@code object} must be an instance of {@code Double} and
203438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * {@code doubleToLongBits} must give the same value for both objects.
204f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
205438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * <p>Note that, unlike {@code ==}, {@code -0.0} and {@code +0.0} compare
206438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * unequal, and {@code NaN}s compare equal by this method.
207f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare this double with.
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Double}; {@code false} otherwise.
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object object) {
2150d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes        return (object instanceof Double) &&
2160d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes                (doubleToLongBits(this.value) == doubleToLongBits(((Double) object).value));
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public float floatValue() {
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (float) value;
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long v = doubleToLongBits(value);
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (int) (v ^ (v >>> 32));
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int intValue() {
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (int) value;
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this object represents an infinite value.
237f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the value of this double is positive or negative
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         infinity; {@code false} otherwise.
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isInfinite() {
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isInfinite(value);
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the specified double represents an infinite value.
247f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param d
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the double to check.
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the value of {@code d} is positive or negative
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         infinity; {@code false} otherwise.
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean isInfinite(double d) {
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (d == POSITIVE_INFINITY) || (d == NEGATIVE_INFINITY);
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this object is a <em>Not-a-Number (NaN)</em> value.
259f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this double is <em>Not-a-Number</em>;
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} if it is a (potentially infinite) double number.
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isNaN() {
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isNaN(value);
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the specified double is a <em>Not-a-Number (NaN)</em>
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value.
270f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param d
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the double value to check.
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if {@code d} is <em>Not-a-Number</em>;
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} if it is a (potentially infinite) double number.
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean isNaN(double d) {
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return d != d;
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
281dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * Returns the <a href="http://en.wikipedia.org/wiki/IEEE_754-1985">IEEE 754</a>
282dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes     * double precision float corresponding to the given {@code bits}.
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static native double longBitsToDouble(long bits);
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long longValue() {
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (long) value;
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a double value.
293f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a double value.
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the primitive double value represented by {@code string}.
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
2988890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a double value.
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
300620666783267ed3a6f7f2b4309a66f1c1f18de53Elliott Hughes    public static double parseDouble(String string) throws NumberFormatException {
301dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes        return StringToReal.parseDouble(string);
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public short shortValue() {
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (short) value;
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Double.toString(value);
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a string containing a concise, human-readable description of the
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified double value.
317f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param d
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             the double to convert to a string.
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a printable representation of {@code d}.
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toString(double d) {
32310a17e23b22dc0ff6363d15bce67d668b6d44dd0Elliott Hughes        return RealToString.getInstance().doubleToString(d);
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a double value.
328f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a double value.
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Double} instance containing the double value represented
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         by {@code string}.
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
3348890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a double value.
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseDouble(String)
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Double valueOf(String string) throws NumberFormatException {
338726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return parseDouble(string);
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the two specified double values. There are two special cases:
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <ul>
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>{@code Double.NaN} is equal to {@code Double.NaN} and it is greater
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * than any other double value, including {@code Double.POSITIVE_INFINITY};</li>
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>+0.0d is greater than -0.0d</li>
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </ul>
348f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param double1
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first value to compare.
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param double2
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the second value to compare.
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a negative value if {@code double1} is less than {@code double2};
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         0 if {@code double1} and {@code double2} are equal; a positive
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value if {@code double1} is greater than {@code double2}.
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int compare(double double1, double double2) {
358f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Non-zero, non-NaN checking.
359f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (double1 > double2) {
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 1;
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
362f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (double2 > double1) {
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return -1;
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
365f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (double1 == double2 && 0.0d != double1) {
366f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return 0;
367f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        }
368f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
369f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // NaNs are equal to other NaNs and larger than any other double
370f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (isNaN(double1)) {
371f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            if (isNaN(double2)) {
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return 0;
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
374f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return 1;
375f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        } else if (isNaN(double2)) {
376f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return -1;
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
378f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
379f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Deal with +0.0 and -0.0
380f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        long d1 = doubleToRawLongBits(double1);
381f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        long d2 = doubleToRawLongBits(double2);
382f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // The below expression is equivalent to:
383f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // (d1 == d2) ? 0 : (d1 < d2) ? -1 : 1
384f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        return (int) ((d1 >> 63) - (d2 >> 63));
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code Double} instance for the specified double value.
389f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param d
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the double value to store in the instance.
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Double} instance containing {@code d}.
393f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Double valueOf(double d) {
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new Double(d);
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified double into its hexadecimal string representation.
401f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param d
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the double to convert.
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hexadecimal string representation of {@code d}.
405f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toHexString(double d) {
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /*
409dc915c69ba2495dd2cf965d16058d0b13762142cElliott Hughes         * Reference: http://en.wikipedia.org/wiki/IEEE_754-1985
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (d != d) {
412f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "NaN";
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (d == POSITIVE_INFINITY) {
415f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "Infinity";
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (d == NEGATIVE_INFINITY) {
418f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return "-Infinity";
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long bitValue = doubleToLongBits(d);
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean negative = (bitValue & 0x8000000000000000L) != 0;
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // mask exponent bits and shift down
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long exponent = (bitValue & 0x7FF0000000000000L) >>> 52;
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // mask significand bits and shift up
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long significand = bitValue & 0x000FFFFFFFFFFFFFL;
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (exponent == 0 && significand == 0) {
430f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return (negative ? "-0x0.0p0" : "0x0.0p0");
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        StringBuilder hexString = new StringBuilder(10);
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (negative) {
435f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("-0x");
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
437f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("0x");
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (exponent == 0) { // denormal (subnormal) value
441f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("0.");
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // significand is 52-bits, so there can be 13 hex digits
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int fractionDigits = 13;
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // remove trailing hex zeros, so Integer.toHexString() won't print
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // them
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while ((significand != 0) && ((significand & 0xF) == 0)) {
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                significand >>>= 4;
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fractionDigits--;
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // this assumes Integer.toHexString() returns lowercase characters
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String hexSignificand = Long.toHexString(significand);
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // if there are digits left, then insert some '0' chars first
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (significand != 0 && fractionDigits > hexSignificand.length()) {
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int digitDiff = fractionDigits - hexSignificand.length();
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while (digitDiff-- != 0) {
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    hexString.append('0');
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hexString.append(hexSignificand);
461f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("p-1022");
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else { // normal value
463f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            hexString.append("1.");
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // significand is 52-bits, so there can be 13 hex digits
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int fractionDigits = 13;
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // remove trailing hex zeros, so Integer.toHexString() won't print
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // them
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while ((significand != 0) && ((significand & 0xF) == 0)) {
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                significand >>>= 4;
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fractionDigits--;
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // this assumes Integer.toHexString() returns lowercase characters
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String hexSignificand = Long.toHexString(significand);
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // if there are digits left, then insert some '0' chars first
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (significand != 0 && fractionDigits > hexSignificand.length()) {
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int digitDiff = fractionDigits - hexSignificand.length();
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while (digitDiff-- != 0) {
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    hexString.append('0');
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hexString.append(hexSignificand);
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hexString.append('p');
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // remove exponent's 'bias' and convert to a string
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hexString.append(Long.toString(exponent - 1023));
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hexString.toString();
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
491