浮点数在虚拟机中的表示

本贴最后更新于 2131 天前,其中的信息可能已经时移世改

综述

在 Java 虚拟机中,浮点数有 float 和 double 两种,分别是 32 位和 64 位浮点数,目前,使用最为广泛的是由 IEEE754 定义的浮点数格式。目前 Java 虚拟机中对于浮点数的处理参考 IEEE754 的规范。

float

本节将以 float 为例,简要介绍浮点数的表示方法。

在 IEEE754 的定义中,一个浮点数由 3 部分组成,分别是:符号位、指数位和尾数位。以
32 位 float 为例,符号位占 1 位,用 s 表示表示正负数,指数位占 8 位,用 e 表示。尾数位占剩余的 23 位,
m 表示
sflag*m*2^(e-127)
其中,sflag 表示符号,当 s 为 0 时,sflag 为 1,当 s 为 1 时,sflag 为-1。m 为尾数值,实
际占用空间为 23 位,但是根据 e 的取值,有 24 位精度。当 e 全为 0 时,尾数位附加为 0,否
则,尾数位附加为 1。e 为指数位,用 8 位表示。

举例

以浮点数-5 为例,其内部表示为:
11000000101000000000000000000000
内部表示可以通过以下代码打印
System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(a)));

符号位为 1 表示负数,
指数位为 10000001,表示 129。
尾数位为:01000000000000000000000。因为 e 不全为 0,故实际的尾数位为:
101000000000000000000000,最前面的 1 是根据 e 添加的,参与运算,但不参与展示。

尾数位表示 2 的指数次幂的和,每一位表示求和数列中的对应项是否为 0,这里表示:
1*2^0+0*2^1+1*2^2+0*2^3+0*2^4+0*2^5

故 11000000101000000000000000000000 的值为:
-1*2^(129-127)*(1*2^0+0*2^1+1*2^2+0*2^3+0*2^4+0*2^5)=-1*4*1.25=-5

特殊数字

浮点数 float 还可以表示一些特殊的数字

正无穷01111111100000000000000000000000
负无穷11111111100000000000000000000000
NaN01111111110000000000000000000000
最大浮点数(3.4028235E38)01111111011111111111111111111111
最小规范化正浮点数(1.17549435E-38)00000000100000000000000000000000
最小正浮点数(1.4E45)00000000000000000000000000000001
000000000000000000000000000000000

其中,指数位全为 1 的表示无穷大和 NaN 等特殊数字。指数位全为 0 的为非规范化的浮点数。

System.out.println(工 nteger.toBinaryString(Float.floatToRawIntBits(a)));

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 203 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    bug 改完了吗
    标题含有错别字