Float源码

看Double就够了,几乎是一样的,Double中全一些https://blog.youkuaiyun.com/qq_26896085/article/details/94733615

package java.lang;
import sun.misc.FloatingDecimal;
import sun.misc.FloatConsts;
import sun.misc.DoubleConsts;
public final class Float extends Number implements Comparable<Float> {
    // float的最大值。 它等于Float.intBitsToFloat(0x7f800000)返回的值。
    public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
    // float的最小值。 它等于Float.intBitsToFloat(0xff800000)返回的值。 
    public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;
    // float类型的Not-a-Number值的常量。 它相当于返回的值Float.intBitsToFloat(0x7fc00000)
    public static final float NaN = 0.0f / 0.0f;
    // 最大正的有限值float 
    public static final float MAX_VALUE = 0x1.fffffeP+127f; // 3.4028235e+38f
    // 最小正正常值
    public static final float MIN_NORMAL = 0x1.0p-126f; // 1.17549435E-38f
    // 最小的正非零值类型float 
    public static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f
    // 归一化float变量可能具有的最大指数
    public static final int MAX_EXPONENT = 127;
    // 归一化float变量可能具有的最小指数
    public static final int MIN_EXPONENT = -126;
    // 32字节 --> 8位
    public static final int SIZE = 32;
    // 用于表示 float值的字节数。
    public static final int BYTES = SIZE / Byte.SIZE;
    // 类原始类型 float的 类实例
    @SuppressWarnings("unchecked")
    public static final Class<Float> TYPE = (Class<Float>) Class.getPrimitiveClass("float");
    
    // 将字符数据f转换成字符串
    public static String toString(float f) {
        // sun包下面的源码,一般看不到
        return FloatingDecimal.toJavaFormatString(f);
    }
    
    // 将float数据,转换成16进制
    public static String toHexString(float f) {
        if (Math.abs(f) < FloatConsts.MIN_NORMAL
            &&  f != 0.0f ) {
            // 调用的是Double中的实现方法,具体看Double源码
            String s = Double.toHexString(Math.scalb((double)f,
                                                     DoubleConsts.MIN_EXPONENT-
                                                     FloatConsts.MIN_EXPONENT));
            return s.replaceFirst("p-1022$", "p-126");
        }
        else // double string与float string相同
            return Double.toHexString(f);
    }
    
    // 将数字字符串转化的float, 并返回新的Float对象
    public static Float valueOf(String s) throws NumberFormatException {
        return new Float(parseFloat(s));
    }
    
    // 获取float值
    public static Float valueOf(float f) {
        return new Float(f);
    }

    // 将数字字符串转化的float
    public static float parseFloat(String s) throws NumberFormatException {
        return FloatingDecimal.parseFloat(s);
    }
    
    // 是否是nan,永远为false
    public static boolean isNaN(float v) {
        return (v != v);
    }
    
    // 是否是无限的float
    public static boolean isInfinite(float v) {
        return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
    }
    // 是否是无限的float
    public static boolean isFinite(float f) {
        // f的绝对值大于float定义的中最大值,
        return Math.abs(f) <= FloatConsts.MAX_VALUE;
    }
    
    // 定义变量用来接收float值
    private final float value;
    
    // 构造函数,传入一个value
    public Float(float value) {
        this.value = value;
    }
    // 构造函数,传入一个double值
    public Float(double value) {
        this.value = (float)value;
    }
    // 构造函数,传入一个字符串
    public Float(String s) throws NumberFormatException {
        value = parseFloat(s);
    }
    
    // 判断是否是nan,这里永远为false
    public boolean isNaN() {
        return isNaN(value);
    }
    
    // 是否是无限的
    public boolean isInfinite() {
        return isInfinite(value);
    }
    // 将float数据转换成其它类型的数据
    public String toString() {
        return Float.toString(value);
    }
    public byte byteValue() {
        return (byte)value;
    }
    public short shortValue() {
        return (short)value;
    }
    public int intValue() {
        return (int)value;
    }
    public long longValue() {
        return (long)value;
    }
    public float floatValue() {
        return value;
    }
    public double doubleValue() {
        return (double)value;
    }
    
    // 获取hashCode值
    @Override
    public int hashCode() {
        return Float.hashCode(value);
    }
    
    // 计算hashCode值
    public static int hashCode(float value) {
        return floatToIntBits(value);
    }
    
    // 比较两个float数据的大小
    public boolean equals(Object obj) {
        return (obj instanceof Float)
               && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
    }
    
    // 将falot转换成int的byte值
    public static int floatToIntBits(float value) {
        int result = floatToRawIntBits(value);
        // 根据位字段,最大指数和非零有效数的值检查NaN。
        if ( ((result & FloatConsts.EXP_BIT_MASK) ==
              FloatConsts.EXP_BIT_MASK) &&
             (result & FloatConsts.SIGNIF_BIT_MASK) != 0)
            result = 0x7fc00000;
        return result;
    }
    
    // ?????????????????
    public static native int floatToRawIntBits(float value);
    public static native float intBitsToFloat(int bits);
    
    // 比较两个float数据
    public int compareTo(Float anotherFloat) {
        return Float.compare(value, anotherFloat.value);
    }
    
    // 比较两个float数据
    public static int compare(float f1, float f2) {
        if (f1 < f2)
            return -1;// val都不是NaN,this.value更小
        if (f1 > f2)
            return 1;// val都不是NaN,this.value更大
        // 由于NaNs的可能性,不能使用floatToRawIntBits。
        int thisBits    = Float.floatToIntBits(f1);
        int anotherBits = Float.floatToIntBits(f2);
        return (thisBits == anotherBits ?  0 : // Values are equal
                (thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
                 1));                          // (0.0, -0.0) or (NaN, !NaN)
    }
    // 求和
    public static float sum(float a, float b) {
        return a + b;
    }
    // 求大值
    public static float max(float a, float b) {
        return Math.max(a, b);
    }
    // 求小值
    public static float min(float a, float b) {
        return Math.min(a, b);
    }
    private static final long serialVersionUID = -2671257302660747028L;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值