一起学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);
}

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,114评论 0 13
  • 在编程中我们总要进行一些数学运算以及数字处理,尤其是浮点数的运算和处理,这篇文章主要介绍C语言下的数学库。而其他语...
    欧阳大哥2013阅读 5,092评论 0 12
  • 概述 Java的Float类主要的作用就是对基本类型float进行封装,提供了一些处理float类型的方法,比如f...
    luoyoub阅读 610评论 1 0
  • 概述 整数和浮点数 JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,1与1...
    许先生__阅读 826评论 2 1
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 1,320评论 0 15