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