9java源码解析-Float

其他 源码解析 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

猜你喜欢

转载自blog.csdn.net/qq_32726809/article/details/82662879