其他 源码解析 https://blog.csdn.net/qq_32726809/article/category/8035214
1类的声明
整个源码与dounle类似
public final class Float extends Number implements Comparable<Float>
- 继承number 可以number族相互转化
- 实现Comparable 可以进行比较
2类属性
public static final float POSITIVE_INFINITY = 1.0f / 0.0f;/*----1*/
public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;/*-----2*/
public static final float NaN = 0.0f / 0.0f;/*-----3*/
public static final float MAX_VALUE = 0x1.fffffeP+127f; // 3.4028235e+38f/*-------4*/
public static final float MIN_NORMAL = 0x1.0p-126f; // 1.17549435E-38f/*---------5*/
public static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f/*---------6*/
public static final int MAX_EXPONENT = 127;/*---------7*/
public static final int MIN_EXPONENT = -126;/*---------8*/
public static final int SIZE = 32;/*---------9*/
public static final int BYTES = SIZE / Byte.SIZE;/*---------10*/
private final float value;/*----------11*/
- 1 正无穷大
- 2 负无穷大
- 3 非数字float类型
- 4 最大值
- 5 最小正数值
- 6 最小值
- 7 指数最大值
- 8 指数最小值
- 9 所占位数
- 10 求出所占字节
- 11 float的具体值,为final ,意味着一旦被创建便不可更改
3构造函数
public Float(float value) {
this.value = value;
}
public Float(double value) {
this.value = (float)value;
}
public Float(String s) throws NumberFormatException {
value = parseFloat(s);
}
暂无源码,不做解释
4方法
由于大部分代码与double类似,因此不做详细描述,只选择有必要的
4.1toHexString(float f)
public static String toHexString(float f) {
if (Math.abs(f) < FloatConsts.MIN_NORMAL
&& f != 0.0f ) {// float subnormal
// Adjust exponent to create subnormal double, then
// replace subnormal double exponent with subnormal float
// exponent
String s = Double.toHexString(Math.scalb((double)f,
/* -1022+126 */
DoubleConsts.MIN_EXPONENT-
FloatConsts.MIN_EXPONENT));
return s.replaceFirst("p-1022$", "p-126");
}
else // double string will be the same as float string
return Double.toHexString(f);
}
这调用的是 double的 toHexString 方法.
4.2isNaN(float v)
public static boolean isNaN(float v) {
return (v != v);
}
与double类似,不做赘述
4.3 hashCode(float value)
public static int hashCode(float value) {
return floatToIntBits(value);
}
这里与double不同,这里返回的直接就是 IEEE 754码
4.4 floatToIntBits(float value)
返回IEEE754标准码
public static int floatToIntBits(float value) {
int result = floatToRawIntBits(value);
// Check for NaN based on values of bit fields, maximum
// exponent and nonzero significand.
if ( ((result & FloatConsts.EXP_BIT_MASK) ==
FloatConsts.EXP_BIT_MASK) &&
(result & FloatConsts.SIGNIF_BIT_MASK) != 0)
result = 0x7fc00000;
return result;
}
注释
IEEE 754 码
转换步骤
- 1 转化为2进制 例如转化3 为 1.1*2^1
- 2 对指数加上127,会把符号位移除 1.1*2^1024
- 3 转化 注意没有符号位
- 1-8为指数位 就是 100 0000 0000
- 8-24为尾数位 就是 1后面 有24个0
- 4 最后值为 10000000_10000000000000000000000