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