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