9java源码解析-Float

本文深入解析了Java中Float类的设计,包括类的声明、构造函数、关键属性如正负无穷大、非数字值等,以及核心方法如toHexString、isNaN等的实现原理,特别关注于与Double类的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其他 源码解析 https://blog.youkuaiyun.com/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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值