一起学JDK源码 -- Float类

前面几篇文章我们看了JAVA基本数据类型整型的包装类,接下来我们看下浮点型float的包装类Float类。

基础知识:

1.IEEE 754:
IEEE 754是一个标准,该标准定义了浮点数的格式还有一些特殊值,它规定了计算机中二进制与十进制浮点数转换的格式及方法。规定了四种表示浮点数值的方法,单精确度(32位)、双精确度(64位)、延伸单精确度(43位以上)与延伸双精确度(79位以上)。JAVA语言支持这里的单精确度float,与双精确度double。
2.无穷大:
JAVA中用Infinity表示正无穷大,任何有限正数除以0为正无穷大,正无穷的值为0x7f800000。用-Infinity表示负无穷大,任何有限负数除以0为负无穷的,负无穷的值为0xff800000。
3.NAN:
不是一个数(not a number ),NaN 用来表示处理计算中出现的错误情况,比如0除以0或负数平方根。

主要属性:

public static final float POSITIVE_INFINITY = 1.0f / 0.0f;

public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;

public static final float NaN = 0.0f / 0.0f;

public static final float MAX_VALUE = 0x1.fffffeP+127f;

public static final float MIN_NORMAL = 0x1.0p-126f;

public static final float MIN_VALUE = 0x0.000002P-126f;

public static final int MAX_EXPONENT = 127;

public static final int MIN_EXPONENT = -126;

POSITIVE_INFINITY 表示正无穷大,其值为0x7f800000。
NEGATIVE_INFINITY 表示负无穷大,其值为0xff800000。
NaN 表示计算出错的情况,NaN 实际上是一个数,而是一族数。
MAX_VALUE最大的浮点数值,其值为3.4028235E38,即2的127次方。
MIN_NORMAL 用来表示最小标准值,它定义为0x1.0p-126f,这里其实就是2的-126次方的了,值为1.17549435E-38f。
MIN_VALUE 最小的浮点数值,其值为1.4e-45f。
MAX_EXPONENT用来表示指数的最大值,这里定为127。
MIN_EXPONENT 用来表示指数的最小值,这里定为-126。

toString(float f):

public static String toString(float f) {
        return FloatingDecimal.toJavaFormatString(f);
}

通过FloatingDecimal类的toJavaFormatString方法转成字符串。它处理的过程是先将浮点数转成IEEE-754标准的二进制形式,并且还要判断是否是正负无穷大,是否是NaN。然后再按照IEEE-754标准从二进制转换成十进制,最后生成浮点数对应的字符串。

toHexString(float f) :

public static String toHexString(float f) {
        if (Math.abs(f) < FloatConsts.MIN_NORMAL
            &&  f != 0.0f ) {
            String s = Double.toHexString(Math.scalb((double)f,
                                                     DoubleConsts.MIN_EXPONENT-
                                                     FloatConsts.MIN_EXPONENT));
            return s.replaceFirst("p-1022$", "p-126");
        }
        else
            return Double.toHexString(f);
}

看方法名就知道是将,float转换成16进制表示的形式,这里先会判断下目标数f,如果是NaN则返回字符串"NaN",如果是正无穷大,则返回Infinity。如果是负无穷大则返回-Infinity。如果f为0,则用返回"0x0.0p0",-0则返回"-0x0.0p0"。如果f是具有标准化表示形式的float值,则使用子字符串表示有效位数和指数。有效位数用字符串"0x1."表示,后跟该有效位数小数部分的小写十六进制表示形式。除非所有位数都为0,否则移除十六进制表示形式中的尾部0,在所有位数为0的情况下,可以用一个0表示,然后用"p"表示指数,后跟无偏指数的十进制字符串,该值与对指数值调用Integer.toString生成的值相同。如果f是具有subnormal表示形式的float值,则用字符"0x0."表示有效位数,后跟该有效位数小数部分的十六进制表示形式,移除十六进制表示形式中的尾部0,然后用"p-126"表示指数。注意,在subnormal有效位数中,必须至少有一个非0位数。(网上摘的,我也看不大懂)

valueOf

public static Float valueOf(String s) throws NumberFormatException {
        return new Float(parseFloat(s));
}

public static Float valueOf(float f) {
        return new Float(f);
}

返回对应浮点数的Float对象,可以看到在Float类中没有像Byte或是Integer类那样将常用的数存放到缓存池中。这里是直接创建对象,然后返回。

parseFloat(String s) :

public static float parseFloat(String s) throws NumberFormatException {
        return FloatingDecimal.parseFloat(s);
}

通过调用FloatingDecimal的parseFloat方法来实现对字符串的转换.这里会先判断s是否为NaN,Infinity,-Infinity等数。如果是以0x打头则会按16进制转换为10进制转换。判断是否包含了E字符,即是否是科学计数法,如果有则需要处理。

isNaN:

public static boolean isNaN(float v) {
        return (v != v);
}

判断一个数是否是NaN,该方法逻辑很简单,直接判断一个数是否与自己相等,因为规定一个NaN与任何值都不相等,包括它自己。这部分逻辑在JVM中会做,这里直接通过比较来判断就可以了。

isInfinite

public static boolean isInfinite(float v) {
        return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
}

判断一个数是否为无穷数,无穷大POSITIVE_INFINITY或无穷小NEGATIVE_INFINITY。

isFinite:

public static boolean isFinite(float f) {
        return Math.abs(f) <= FloatConsts.MAX_VALUE;
}

判断一个数是否为有穷数。绝对值(Math.abs(f)是用来获取一个数的绝对值的)小于FloatConsts.MAX_VALUE的数则为有穷数,FloatConsts.MAX_VALUE的值为3.4028235e+38f,它其实与Float类中定义的MAX_VALUE相同。

floatToRawIntBits:

 public static native int floatToRawIntBits(float value);

floatToRawIntBits是一个本地方法,该方法主要是将一个浮点数转成IEEE 754标准的二进制形式对应的整型数。用其它语言实现。

floatToIntBits:

public static int floatToIntBits(float value) {
    int result = floatToRawIntBits(value);
    if ( ((result & FloatConsts.EXP_BIT_MASK) ==
          FloatConsts.EXP_BIT_MASK) &&
         (result & FloatConsts.SIGNIF_BIT_MASK) != 0)
        result = 0x7fc00000;
    return result;
}

该方法主要先通过调用floatToRawIntBits获取到IEEE 754标准对应的整型数,然后再分别用FloatConsts.EXP_BIT_MASK和FloatConsts.SIGNIF_BIT_MASK两个掩码去判断是否为NaN,0x7fc00000对应的即为NaN。

intBitsToFloat:

public static native float intBitsToFloat(int bits);

该方法与floatToRawIntBits方法对应,intBitsToFloat同样是一个本地方法,该方法主要是将一个IEEE 754标准的二进制形式对应的整型数转成一个浮点数。用其它语言实现。

sum:

public static float sum(float a, float b) {
        return a + b;
}

计算两个浮点数的和。

max:

public static float max(float a, float b) {
        return Math.max(a, b);
}

取两个浮点数中较大的一个。

min:

public static float min(float a, float b) {
        return Math.min(a, b);
}

取两个浮点数中较小的一个。
查看所有目录

你可能感兴趣的:(一起学JDK源码 -- Float类)