Float源码分析
- 一.概述
- 二.源码分析
- 1.全局变量
- 2.构造方法
- 3. parseFloat方法
- 4. valueOf方法
- 5. isNaN方法
- 6. isInfinite方法
- 7. isFinite方法
- 8. floatToIntBits方法
- 9. intBitsToFloat方法
- 10. toString方法
- 11. toHexString方法
- 12. byteValue方法
- 13. shortValue方法
- 14. intValue方法
- 15. longValue方法
- 16. floatValue方法
- 17. doubleValue方法
- 18. hashCode方法
- 19. equals方法
- 20. compareTo方法
- 21. sum方法
- 22.max方法
- 23. min方法
一.概述
Float是float的包装类,用于表示单精度浮点数。
Float的表示方法和int、short、long不同。Float满足IEEE754浮点数表示法。
Float表示的数值占4个字节,共32位。其中0到22位表示尾数部分;23到31位表示指数部分;32位为符号位。
Float.java中的相关代码:
public final class Float extends Number implements Comparable<Float> {
…
}
1.Float被final修饰,不能被继承。
2.继承了Number,可以实现数值间的转换。
3.实现了Comparable<Float>接口,可以进行Float类型对象之间的比较。
二.源码分析
1.全局变量
Float.java中的相关代码:
// 表示正无穷
// 它的值和Float.intBitsToFloat(0x7f800000)计算的结果相同
public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
// 表示负无穷
// 它的值和Float.intBitsToFloat(0xff800000)计算的结果相同
public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;
// 表示不是一个数,即一个数不能被表示
// 它的值和Float.intBitsToFloat(0x7fc00000)计算的结果相同
public static final float NaN = 0.0f / 0.0f;
// 表示float所能表示的最大值:3.4028235e+38f
// 它的值和Float.intBitsToFloat(0x7f7fffff)计算的结果相同
public static final float MAX_VALUE = 0x1.fffffeP+127f;
// 表示正常情况下,float可以表示的最小正数:1.17549435E-38f
// 正常情况为小数点前为0x1
// 它的值和Float.intBitsToFloat(0x00800000)计算的结果相同
public static final float MIN_NORMAL = 0x1.0p-126f;
// 表示float实际上可以表示的最小非零正数:1.4e-45f
// 小数点前为0x0
// 它的值和Float.intBitsToFloat(0x1)计算的结果相同
public static final float MIN_VALUE = 0x0.000002P-126f;
// float可以表示的最大指数
public static final int MAX_EXPONENT = 127;
// float可以表示的最小指数
public static final int MIN_EXPONENT = -126;
// float占的位数
public static final int SIZE = 32;
// 一个float数值占的字节数
public static final int BYTES = SIZE / Byte.SIZE;
// 抑制没有类型检查而出现的警告
@SuppressWarnings("unchecked")
// Float类中对应的原始的float
// Float.class和float.class不相等,但Float.TYPE和float.class相等
public static final Class<Float> TYPE = (Class<Float>) Class.getPrimitiveClass("float");
// 用于存储float的数值
private final float value;
// 用于序列化
private static final long serialVersionUID = -2671257302660747028L;
2.构造方法
1)参数为float
Float.java中的相关代码:
public Float(float value) {
// 保存到全局变量
this.value = value;
}
2)参数为double
Float.java中的相关代码:
public Float(double value) {
// 先类型转换,再保存到全局变量
this.value = (float)value;
}
3)参数为String
Float.java中的相关代码:
public Float(String s) throws NumberFormatException {
// 调用parseFloat方法,将字符串解析成float型数值
value = parseFloat(s);
}
3. parseFloat方法
将字符串解析成float型数值。
Float.java中的相关代码:
public static float parseFloat(String s) throws NumberFormatException {
// 调用FloatingDecimal的parseFloat方法
return FloatingDecimal.parseFloat(s);
}
4. valueOf方法
1)参数为float
将float型数值转换为Float对象。
Float.java中的相关代码:
public static Float valueOf(float f) {
// 创建Float对象,对float数值进行封装,返回
return new Float(f);
}
2)参数为String
将String对象转换为Float对象。
Float.java中的相关代码:
public static Float valueOf(String s) throws NumberFormatException {
// 调用parseFloat方法,将字符串解析成float型数值
// 创建Float对象,对float数值进行封装,返回
return new Float(parseFloat(s));
}
5. isNaN方法
判断当前的数是不是数值型的数。
Float.java中的相关代码:
public boolean isNaN() {
// 调用了重载方法
return isNaN(value);
}
调用重载的isNaN方法。
判断float型的数是不是数值型的数。
Float.java中的相关代码:
public static boolean isNaN(float v) {
// 每个NaN的存储地址不同
return (v != v);
}
6. isInfinite方法
判断当前的数是不是无穷大。
Float.java中的相关代码:
public boolean isInfinite() {
// 调用了重载方法
return isInfinite(value);
}
调用了重载的isInfinite方法。
判断float型的数是不是无穷大。
Float.java中的相关代码:
public static boolean isInfinite(float v) {
// 判断是否为正无穷或负无穷
return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
}
7. isFinite方法
判断一个float型的数是否有限。
Float.java中的相关代码:
public static boolean isFinite(float f) {
// 对float数取绝对值,判断是否小于等于float能表示的最大值
return Math.abs(f) <= FloatConsts.MAX_VALUE;
}
8. floatToIntBits方法
将float型的数转换成满足IEEE 754浮点型表示法的int型的数。
符号位MASK:0x80000000
指数位MASK:0x7f800000
有效位MASK:0x007fffff
正无穷:0x7f800000
负无穷:0xff800000
NaN:0x7fc00000
Float.java中的相关代码:
public static int floatToIntBits(float value) {
// 调用floatToRawIntBits转换成int型的数
// 详解在1)处
int result = floatToRawIntBits(value);
// 根据指数位和非零有效位判断是不是NaN
if ( ((result & FloatConsts.EXP_BIT_MASK) ==
FloatConsts.EXP_BIT_MASK) &&
(result & FloatConsts.SIGNIF_BIT_MASK) != 0)
// 若是,则设置为NaN
result = 0x7fc00000;
// 返回
return result;
}
1)floatToRawIntBits方法
Float.java中的相关代码:
public static native int floatToRawIntBits(float value);
该方法是一个native方法,该方法会将一个float型的数转换成满足IEEE 754浮点型表示法的int型的数,即使该数为NaN,也会进行转换。
9. intBitsToFloat方法
将int型的数按照IEEE 754浮点数标准转换为float型的数。
Float.java中的相关代码:
public static native float intBitsToFloat(int bits);
该方法是一个native方法。
10. toString方法
将Float对象转换为String对象。
Float.java中的相关代码:
public String toString() {
// 调用了重载方法
return Float.toString(value);
}
调用了重载的toString方法。
Float.java中的相关代码:
public static String toString(float f) {
// 调用FloatingDecimal的toJavaFormatString方法
return FloatingDecimal.toJavaFormatString(f);
}
11. toHexString方法
将float型的数转换为十六进制的String对象。
Float.java中的相关代码:
public static String toHexString(float f) {
// 对数值取绝对值,若小于正常的最小正数,同时不为0
if (Math.abs(f) < FloatConsts.MIN_NORMAL
&& f != 0.0f ) {
// 对数值进行类型转换,变为double型的数
// 调用Math的scalb方法
// DoubleConsts.MIN_EXPONENT-FloatConsts.MIN_EXPONENT = -896
// 相当于数值f乘以2的-896次方
// 最后调用Double的toHexString进行转换
String s = Double.toHexString(Math.scalb((double)f,
DoubleConsts.MIN_EXPONENT-FloatConsts.MIN_EXPONENT));
// 因为Double的指数为-1022,Float为-126,所以需要替换
// 使用正则表达式,从后向前替换
return s.replaceFirst("p-1022$", "p-126");
}
else // 若大于等于正常的最小整数,或等于0
// 调用Double的toHexString进行处理
return Double.toHexString(f);
}
12. byteValue方法
获取当前数值对应的byte型数。
Float.java中的相关代码:
public byte byteValue() {
// 进行类型转换,返回
return (byte)value;
}
13. shortValue方法
获取当前数值对应的short型数。
Float.java中的相关代码:
public short shortValue() {
// 进行类型转换,返回
return (short)value;
}
14. intValue方法
获取当前数值对应的int型数。
Float.java中的相关代码:
public int intValue() {
// 进行类型转换,返回
return (int)value;
}
15. longValue方法
获取当前数值对应的long型数。
Float.java中的相关代码:
public long longValue() {
// 进行类型转换,返回
return (long)value;
}
16. floatValue方法
获取当前数值对应的float型数。
Float.java中的相关代码:
public float floatValue() {
// 直接返回
return value;
}
17. doubleValue方法
获取当前数值对应的double型数。
Float.java中的相关代码:
public double doubleValue() {
// 进行类型转换,返回
return (double)value;
}
18. hashCode方法
获取Float对象的哈希值。
Float.java中的相关代码:
@Override
public int hashCode() {
// 调用Float的静态方法
return Float.hashCode(value);
}
1)hashCode方法
Float.java中的相关代码:
public static int hashCode(float value) {
// 调用floatToIntBits方法,转化为满足IEEE 754浮点表示的int型数
return floatToIntBits(value);
}
19. equals方法
比较两个Float对象是否相等。
Float.java中的相关代码:
public boolean equals(Object obj) {
// 若类型为Float
// 同时转换为int型后比较相等,则返回true
return (obj instanceof Float)
&& (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}
20. compareTo方法
对两个Float对象进行比较。
若相等,则返回0。若大于anotherFloat则返回1,小于则返回-1。
Float.java中的相关代码:
public int compareTo(Float anotherFloat) {
// 调用Float的静态方法compare
return Float.compare(value, anotherFloat.value);
}
1)compare方法
Float.java中的相关代码:
public static int compare(float f1, float f2) {
// 若小于,则返回-1
if (f1 < f2)
return -1;
// 若大于,则返回1
if (f1 > f2)
return 1;
// 此时两个数可能相等,或至少其中一个为NaN
// 调用floatToIntBits方法进行转换
int thisBits = Float.floatToIntBits(f1);
int anotherBits = Float.floatToIntBits(f2);
// 若相等,则返回0
// 若小于,说明thisBits =-0.0, anotherBits = 0.0)
// 或thisBits != NaN, anotherBits = NaN
// 若大于,说明thisBits =0.0, anotherBits = -0.0)
// 或thisBits = NaN, anotherBits != NaN
return (thisBits == anotherBits ? 0 :
(thisBits < anotherBits ? -1 :
1));
}
21. sum方法
求两个float数的和。
Float.java中的相关代码:
public static float sum(float a, float b) {
// 相加,返回
return a + b;
}
22.max方法
求两个float数的最大值。
Float.java中的相关代码:
public static float max(float a, float b) {
// 调用Math的max方法
return Math.max(a, b);
}
23. min方法
求两个float数的最小值。
Float.java中的相关代码:
public static float min(float a, float b) {
// 调用Math的min方法
return Math.min(a, b);
}