Float.java revision 706de1164836051ab31cc69eb77a6bba1a723896
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 /** 77b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes * Maximum 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 /** 85b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes * Minimum 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(); 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Note: This can't be set to "float.class", since *that* is 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // defined to be "java.lang.Float.TYPE"; 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constant for the number of bits needed to represent a {@code float} in 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * two's complement form. 108f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 109f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.5 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final int SIZE = 32; 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new {@code Float} with the specified primitive float value. 115f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param value 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the primitive float value to store in the new instance. 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Float(float value) { 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.value = value; 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new {@code Float} with the specified primitive double value. 125f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param value 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the primitive double value to store in the new instance. 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Float(double value) { 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.value = (float) value; 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new {@code Float} from the specified string. 135f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param string 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the string representation of a float value. 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NumberFormatException 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code string} can not be decoded into a float value. 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #parseFloat(String) 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Float(String string) throws NumberFormatException { 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(parseFloat(string)); 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Compares this object to the specified float object to determine their 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * relative order. There are two special cases: 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>{@code Float.NaN} is equal to {@code Float.NaN} and it is greater 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * than any other float value, including {@code Float.POSITIVE_INFINITY};</li> 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>+0.0f is greater than -0.0f</li> 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 154f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param object 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the float object to compare this object to. 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a negative value if the value of this float is less than the 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * value of {@code object}; 0 if the value of this float and the 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * value of {@code object} are equal; a positive value if the value 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of this float is greater than the value of {@code object}. 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.lang.Comparable 162f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.2 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int compareTo(Float object) { 165f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return compare(value, object.value); 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte byteValue() { 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (byte) value; 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public double doubleValue() { 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return value; 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 179438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes * Tests this double for equality with {@code object}. 180438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes * To be equal, {@code object} must be an instance of {@code Float} and 181438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes * {@code floatToIntBits} must give the same value for both objects. 182f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 183438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes * <p>Note that, unlike {@code ==}, {@code -0.0} and {@code +0.0} compare 184438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes * unequal, and {@code NaN}s compare equal by this method. 185f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param object 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the object to compare this float with. 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the specified object is equal to this 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Float}; {@code false} otherwise. 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean equals(Object object) { 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (object == this) 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project || (object instanceof Float) 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && (floatToIntBits(this.value) == floatToIntBits(((Float) object).value)); 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Converts the specified float value to a binary representation conforming 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to the IEEE 754 floating-point single precision bit layout. All 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>Not-a-Number (NaN)</em> values are converted to a single NaN 2027023c8ff547217ec58f062255a850e54bfefc681Elliott Hughes * representation ({@code 0x7fc00000}). 203f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param value 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the float value to convert. 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the IEEE 754 floating-point single precision representation of 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code value}. 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #floatToRawIntBits(float) 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #intBitsToFloat(int) 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static native int floatToIntBits(float value); 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Converts the specified float value to a binary representation conforming 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to the IEEE 754 floating-point single precision bit layout. 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>Not-a-Number (NaN)</em> values are preserved. 217f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param value 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the float value to convert. 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the IEEE 754 floating-point single precision representation of 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code value}. 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #floatToIntBits(float) 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #intBitsToFloat(int) 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static native int floatToRawIntBits(float value); 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the primitive value of this float. 229f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return this object's primitive value. 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public float floatValue() { 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return value; 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int hashCode() { 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return floatToIntBits(value); 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Converts the specified IEEE 754 floating-point single precision bit 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * pattern to a Java float value. 245f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param bits 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the IEEE 754 floating-point single precision representation of 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a float value. 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the float value converted from {@code bits}. 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #floatToIntBits(float) 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #floatToRawIntBits(float) 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static native float intBitsToFloat(int bits); 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int intValue() { 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (int) value; 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether this object represents an infinite value. 262f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the value of this float is positive or negative 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * infinity; {@code false} otherwise. 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isInfinite() { 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return isInfinite(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 represents an infinite value. 272f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param f 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the float to check. 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the value of {@code f} is positive or negative 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * infinity; {@code false} otherwise. 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static boolean isInfinite(float f) { 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (f == POSITIVE_INFINITY) || (f == NEGATIVE_INFINITY); 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether this object is a <em>Not-a-Number (NaN)</em> value. 284f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if this float is <em>Not-a-Number</em>; 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} if it is a (potentially infinite) float number. 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isNaN() { 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return isNaN(value); 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether the specified float is a <em>Not-a-Number (NaN)</em> 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * value. 295f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param f 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the float value to check. 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if {@code f} is <em>Not-a-Number</em>; 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} if it is a (potentially infinite) float number. 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static boolean isNaN(float f) { 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return f != f; 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long longValue() { 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (long) value; 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Parses the specified string as a float value. 312f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param string 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the string representation of a float value. 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the primitive float value represented by {@code string}. 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NumberFormatException 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code string} is {@code null}, has a length of zero or 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * can not be parsed as a float value. 319f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @see #valueOf(String) 320f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.2 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static float parseFloat(String string) throws NumberFormatException { 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return org.apache.harmony.luni.util.FloatingPointParser 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .parseFloat(string); 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public short shortValue() { 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (short) value; 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Float.toString(value); 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a string containing a concise, human-readable description of the 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified float value. 340f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param f 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the float to convert to a string. 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a printable representation of {@code f}. 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static String toString(float f) { 346706de1164836051ab31cc69eb77a6bba1a723896Elliott Hughes return new RealToString().floatToString(f); 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Parses the specified string as a float value. 351f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param string 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the string representation of a float value. 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a {@code Float} instance containing the float value represented 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by {@code string}. 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NumberFormatException 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code string} is {@code null}, has a length of zero or 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * can not be parsed as a float value. 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #parseFloat(String) 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static Float valueOf(String string) throws NumberFormatException { 362726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch return parseFloat(string); 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Compares the two specified float values. There are two special cases: 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>{@code Float.NaN} is equal to {@code Float.NaN} and it is greater 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * than any other float value, including {@code Float.POSITIVE_INFINITY};</li> 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>+0.0f is greater than -0.0f</li> 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 372f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param float1 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the first value to compare. 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param float2 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the second value to compare. 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a negative value if {@code float1} is less than {@code float2}; 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 0 if {@code float1} and {@code float2} are equal; a positive 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * value if {@code float1} is greater than {@code float2}. 380f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.4 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static int compare(float float1, float float2) { 383f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // Non-zero, non-NaN checking. 384f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (float1 > float2) { 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 1; 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 387f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (float2 > float1) { 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 390f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (float1 == float2 && 0.0f != float1) { 391f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return 0; 392f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 393f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 394f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // NaNs are equal to other NaNs and larger than any other float 395f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (isNaN(float1)) { 396f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (isNaN(float2)) { 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 0; 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 399f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return 1; 400f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } else if (isNaN(float2)) { 401f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return -1; 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 403f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 404f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // Deal with +0.0 and -0.0 405f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson int f1 = floatToRawIntBits(float1); 406f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson int f2 = floatToRawIntBits(float2); 407f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // The below expression is equivalent to: 408f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // (f1 == f2) ? 0 : (f1 < f2) ? -1 : 1 409f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // because f1 and f2 are either 0 or Integer.MIN_VALUE 410f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return (f1 >> 31) - (f2 >> 31); 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a {@code Float} instance for the specified float value. 415f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param f 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the float value to store in the instance. 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a {@code Float} instance containing {@code f}. 419f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.5 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static Float valueOf(float f) { 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Float(f); 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Converts the specified float into its hexadecimal string representation. 427f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param f 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the float to convert. 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the hexadecimal string representation of {@code f}. 431f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.5 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static String toHexString(float f) { 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reference: http://en.wikipedia.org/wiki/IEEE_754 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (f != f) { 438f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return "NaN"; 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (f == POSITIVE_INFINITY) { 441f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return "Infinity"; 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (f == NEGATIVE_INFINITY) { 444f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return "-Infinity"; 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int bitValue = floatToIntBits(f); 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean negative = (bitValue & 0x80000000) != 0; 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // mask exponent bits and shift down 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int exponent = (bitValue & 0x7f800000) >>> 23; 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // mask significand bits and shift up 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // significand is 23-bits, so we shift to treat it like 24-bits 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int significand = (bitValue & 0x007FFFFF) << 1; 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (exponent == 0 && significand == 0) { 457f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return (negative ? "-0x0.0p0" : "0x0.0p0"); 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuilder hexString = new StringBuilder(10); 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (negative) { 462f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes hexString.append("-0x"); 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 464f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes hexString.append("0x"); 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (exponent == 0) { // denormal (subnormal) value 468f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes hexString.append("0."); 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // significand is 23-bits, so there can be 6 hex digits 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int fractionDigits = 6; 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // remove trailing hex zeros, so Integer.toHexString() won't print 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // them 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while ((significand != 0) && ((significand & 0xF) == 0)) { 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project significand >>>= 4; 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fractionDigits--; 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this assumes Integer.toHexString() returns lowercase characters 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String hexSignificand = Integer.toHexString(significand); 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if there are digits left, then insert some '0' chars first 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (significand != 0 && fractionDigits > hexSignificand.length()) { 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int digitDiff = fractionDigits - hexSignificand.length(); 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (digitDiff-- != 0) { 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hexString.append('0'); 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hexString.append(hexSignificand); 488f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes hexString.append("p-126"); 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { // normal value 490f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes hexString.append("1."); 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // significand is 23-bits, so there can be 6 hex digits 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int fractionDigits = 6; 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // remove trailing hex zeros, so Integer.toHexString() won't print 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // them 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while ((significand != 0) && ((significand & 0xF) == 0)) { 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project significand >>>= 4; 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fractionDigits--; 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this assumes Integer.toHexString() returns lowercase characters 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String hexSignificand = Integer.toHexString(significand); 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if there are digits left, then insert some '0' chars first 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (significand != 0 && fractionDigits > hexSignificand.length()) { 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int digitDiff = fractionDigits - hexSignificand.length(); 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (digitDiff-- != 0) { 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hexString.append('0'); 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hexString.append(hexSignificand); 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hexString.append('p'); 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // remove exponent's 'bias' and convert to a string 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hexString.append(Integer.toString(exponent - 127)); 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return hexString.toString(); 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 517