本篇先介绍IEEE754标准中针对浮点数的规范,然后以问答形式补充有关浮点数的知识点。

(一)IEEE754标准

IEEE 754 标准即IEEE浮点数算术标准,由美国电气电子工程师学会(IEEE)计算机学会旗下的微处理器标准委员会发布。

以32位float数据为例,在内存中的存储形式是1bit的符号位(S),8bit表示指数部分(Exp),23表示小数部分的尾数(Fraction)。

表一 单精度浮点数在内存中存储形式

1bit符号

8bit指数部分

23bit尾数

符号位——S取0时表示负数,取1时表示负数。

指数部分——使用所谓的偏正值形式表示,而不是补码表示,即指数部分采用一个无符号的正数值存储。也就是说指数部分要表示的值等于实际存储值减去一个固定值(对于单精度float类型,是127)。采用这种方式表示的目的是简化比较,因为,如果采用补码表示的话,全体符号位S和Exp自身的符号位将导致不能简单的进行大小比较。因为指数值的大小从0~255(0和255是特殊值),单精度的指数部分范围是-127~+128(对应的,-127和128是特殊值)。

尾数部分——23bit尾数仅能表示小数部分的尾数,小数部分最高有效位由指数部分决定,具体见下表。小数部分最高有效位是1的数被称为正规形式。小数部分最高有效位是0的数被称为非正规形式,其他情况是特殊值。

表二 单精度浮点数表示规则

符号

指数

部分

指数部分-127

尾数部分

小数部分的

最高有效位

形式

1

255

128

非0

没有

NaN

1

255

128

0

没有

负无穷

1

1~254

-126~127

任意

1

正规形式(负数)

1

0

-127

非0

0

非正规形式(负数)

1

0

-127

0

没有

负0

0

0

-127

0

没有

正0

0

0

-127

非0

0

非正规形式(正数)

0

1~254

-126~127

任意

1

正规形式(正数)

0

255

128

0

没有

正无穷

0

255

128

非0

没有

NaN

按照IEEE标准,除了NaN以外,浮点数集合中的所有元素都是有序的。如果把它们从小到大按顺序排列好,那顺序将会是:负无穷,正规形式(负数)、非正规形式(负数)、负0、正0、非正规形式(正数)、正规形式(正数)、正无穷。

对于64bit的双精度double类型,在内存中的存储形式是1bit的符号位(S),11bit表示指数部分(Exp),52bit表示小数部分的尾数(Fraction)。指数部分的偏正值是1023,其他情况跟单精度类似,不再赘述。

(二)浮点数Q&A

1)浮点数可以表示数据的范围是什么?

不考虑特殊值(无穷大、NaN等),浮点数可以表示的范围是[-Max,Max]。其中Max是浮点数能表示的最大值,具体值参见表三。

表三 浮点数最大值

浮点类型

字节码

16进制表示

10进制表示

单精度

7f7fffff

0x1.fffffep127

3.4028235E38

双精度

7fefffffffffffff

0x1.fffffffffffffp1023

1.7976931348623157E308

2)浮点数的精度怎样衡量?

浮点数指数部分Exp的数值决定了浮点数与相邻浮点数的差值,所以,指数部分越小(单精度最小为-127),即浮点数绝对值越小(也就是浮点数越靠近0),相邻浮点数的差值越小(单精度最小为2^(-127)),浮点数能表示的有效小数位数越多。反之,指数部分越大(单精度最大为127),即浮点数绝对值越大(也就是浮点数越远离0),相邻浮点数的差值越大(单精度最小为2^(127)),浮点数能表示的有效小数位数越少。但是,从科学计算的角度看,不管指数部分的数值是多少,浮点数的有效位数由尾数部分决定,单精度的有效数是7位,双精度的有效数是16位。

表四 浮点数最小正数

浮点类型

字节码

16进制表示

10进制表示

单精度最小正数

00000001

0x0.000002p-126

1.4E-45

双精度最小正数

0000000000000001

0x0.0000000000001p-1022

4.9E-324

3)我们知道,在Java中,存在基本数据类型的自动转换,比如,直接将一个整形字面量赋给一个float变量。 那么,在自动转换后,整形的精度会丢失么?

当浮点集中没有与整形值对应的浮点数时,会将整形值转化成最接近的浮点值,此时,整形值会丢失精度。例如下面的例子,数值为33554431的整形转化成单精度浮点数后,变成3.3554432E7,即33554432。

int intValue = Integer.MAX_VALUE >> 6;// 33554431

float floatFromInt = intValue;

System.out.println(floatFromInt);// 3.3554432E7

System.out.println(intValue);// 33554431

最后附查看某些浮点数字节码、16进制表示、10进制表示的源码及运行结果。

单精度源码及结果。

1 packagecom.wsm.test;2

3 public classTestFloat {4

5 /**

6 *@paramargs7 */

8 public static voidmain(String[] args) {9

10 int intValue = Integer.MAX_VALUE >> 6;//33554431

11 float floatFromInt =intValue;12 System.out.println(floatFromInt);//3.3554432E7

13 System.out.println(intValue);//33554431

14

15 System.out.printf("%-12s\t%-20s%-12s%-20s\n", "描述", "十六进制数",16 " 字节码", " 十进制数");17 print("正 无 穷", Float.POSITIVE_INFINITY);18 print("最 大 值", Float.MAX_VALUE);19 print("最小正规形式正数", Float.MIN_NORMAL);20 print("最大非正规形式值", +0x0.fffffep-127f);21 print("最 小 正 数", Float.MIN_VALUE);22 print("负 无 穷", Float.NEGATIVE_INFINITY);23 print("规 范 的 NaN", Float.NaN);24 print("其 他 的 NaN", Float.intBitsToFloat(Integer25 .valueOf(0xffc54321)));26

27 }28

29 static void print(String describe, floatfloatNum) {30 System.out.printf("%-12s\t%-20s%-12s%-20s\n", describe, Float31 .toHexString(floatNum), insertZero(Integer.toHexString(Float32 .floatToRawIntBits(floatNum)), 8), floatNum);33 }34

35 static String insertZero(String input, intlength) {36 StringBuilder sb = newStringBuilder(input);37 while (sb.length()

Float

3.3554432E7

33554431

描述           十六进制数                       字节码             十进制数

正        无         穷 Infinity            7f800000    Infinity

最        大         值 0x1.fffffep127      7f7fffff    3.4028235E38

最小正规形式正数     0x1.0p-126          00800000    1.17549435E-38

最大非正规形式值     0x0.8p-126          00400000    5.877472E-39

最    小      正    数 0x0.000002p-126     00000001    1.4E-45

负         无        穷 -Infinity           ff800000    -Infinity

规     范     的 NaN NaN                 7fc00000    NaN

其     他     的 NaN NaN                 ffc54321    NaN

双精度源码及结果。

1 packagecom.wsm.test;2

3 public classTestDouble {4

5 /**

6 *@paramargs7 */

8 public static voidmain(String[] args) {9

10 System.out.printf("%-12s\t%-30s%-24s%-40s\n", "描述", "十六进制数",11 " 字节码",12 " 十进制数");13 print("正 无 穷", Double.POSITIVE_INFINITY);14 print("最 大 值", Double.MAX_VALUE);15 print("最小正规形式正数", Double.MIN_NORMAL);16 print("最大非正规形式值", +0x0.fffffffffffffp-1023d);17 print("最 小 正 数", Double.MIN_VALUE);18 print("负 无 穷", Double.NEGATIVE_INFINITY);19 print("规 范 的 NaN", Double.NaN);20 print("其 他 的 NaN", Double.longBitsToDouble(Long21 .valueOf(0xfff8000000054321L)));22

23 }24

25 static voidprint(String describe, Double DoubleNum) {26 System.out.printf("%-12s\t%-30s%-24s%-40s\n", describe, Double27 .toHexString(DoubleNum), insertZero(Long.toHexString(Double28 .doubleToRawLongBits(DoubleNum)), 16), DoubleNum);29 }30

31 static String insertZero(String input, intlength) {32 StringBuilder sb = newStringBuilder(input);33 while (sb.length()

Double

描述           十六进制数                                           字节码                                      十进制数

正        无         穷 Infinity                      7ff0000000000000        Infinity

最        大         值 0x1.fffffffffffffp1023        7fefffffffffffff        1.7976931348623157E308

最小正规形式正数     0x1.0p-1022                   0010000000000000        2.2250738585072014E-308

最大非正规形式值     0x0.8p-1022                   0008000000000000        1.1125369292536007E-308

最    小      正    数 0x0.0000000000001p-1022       0000000000000001        4.9E-324

负         无        穷 -Infinity                     fff0000000000000        -Infinity

规     范     的 NaN NaN                           7ff8000000000000        NaN

其     他     的 NaN NaN                           fff8000000054321        NaN

参考资料:

2、《Java虚拟机规范(Java SE 7)》

java单精度浮点_Java 浮点数的范围和精度相关推荐

  1. java 十六进制浮点_Java十六进制浮点文字

    java 十六进制浮点 我如何遇到十六进制浮点数 我正在Java :: Geci中开发一种新功能,以减少代码重新格式化的可能性. 如果重新格式化,当前版本的代码将覆盖原本相同的代码. 这很烦人,因为按 ...

  2. Java单精度与双精度区别_java单精度和双精度的区别

    为什么会有精度问题? 计算机处理数据都涉及到数据的转换和各种复杂运算,比如,不同单位换算,不同进制(如二进制十进制)换算等,很多除法运算不能除尽,比如10÷3=3.3333.......无穷无尽,而精 ...

  3. java 虚拟机规范_Java虚拟机规范----Java虚拟机结构

    Java体系和一些基本概念 Java平台的结构图: JVM与JRE.JDK关系? JVM:Java Virtual Machine(Java虚拟机),负责执行符合规范的Class文件 JRE: Jav ...

  4. java class 关键字_java关键字及其作用

    一. 关键字总览: 访问控制 private protected public 类,方法和变量修饰符 abstract class extends final implements interface ...

  5. java outer关键字_java中的关键字

    abstract : 表明类或者成员方法具有抽象属性 assert : 断言,用来进行程序调试 boolean :基本数据类型之一,声明布尔类型的关键字 break :提前跳出一个块 byte :基本 ...

  6. IEEE-754单精度浮点类型详解(完结篇)

    IEEE-754工业标准 前言 众所周知,计算机内部系统实际只能存储二进制数据,我们在计算机中所使用到的文档.图片.影音等数据,实际都是以二进制的数据形式存放在计算机的内存或者硬盘中,不管内存(内存条 ...

  7. IEEE-754单精度浮点类型存储(每个步骤都有画图,清晰明了,通俗易懂)

    IEEE-754标准单精度浮点类型存储概述 folat(32位单精度浮点类型) java中浮点类型也就是小数类型,浮点类型一共有两种,float和double:float为32位(4字节)单精度浮点类 ...

  8. java 中关键字_Java中的关键字

    Java中的关键字一共有53个,包含常用的51个关键字和2个保留字 1.   保留字 2个:预留的关键字,即Java中未被使用到的关键字 const 保留字,即预留的关键字 goto 保留字,即预留的 ...

  9. java系统教程_Java 教程(开发环境配置+基础语法)

    Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境. window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:http://www.ora ...

最新文章

  1. 欧几里德结构数据与 非欧几里德结构数据
  2. C# 用装饰模式实现蝌蚪变青蛙的过程
  3. 【Android 内存优化】Android 原生 API 图片压缩原理 ( 哈夫曼编码开关 | 哈夫曼编码原理 | libjpeg-turbo 函数库 )
  4. 程序运行正常,数据库没反应
  5. 《大道至简》第二章 读后感
  6. 计算机怎么查看U盘品牌,如何查看电脑u盘使用
  7. browserCaps与浏览器功能设置
  8. node + ts读取csv文件为二维数组
  9. 触发器 索引视图 游标 事务
  10. 西门子PLC开发笔记(一):PLC介绍,西门子S1200系列接线、编程、下载和仿真
  11. 软件功能测试点---总结大全
  12. 【无机纳米材料科研制图——OriginLab 0206】Origin绘制X射线衍射XRD堆叠图
  13. 消灭Bug,开发者不可不知的几款Bug探索测试神器。
  14. python selenium Frefox使 用代理访问网页
  15. IP地址、网络号、主机号、网络地址、子网掩码、网关、192.168.0.1/24是什么意思
  16. x86 - 操作系统:中断、陷阱、异常、故障、终止
  17. 【无标题】 2022年铜陵市外观设计专利申请条件及费用
  18. 秒杀项目05-页面优化技术
  19. flask-migrate(flask_script与flask2.0不再兼容)
  20. 《绿光森林》惹争议 收视冠军也是挨骂冠军

热门文章

  1. 婚姻匹配算法(图实现)
  2. 小米9耳机音量限制_为什么您的孩子应该使用音量限制耳机
  3. mysql hang_mysql连接hang住问题分析
  4. Java 面向对象测试题-3
  5. python面向对象小项目_python之面向对象
  6. 前端开发使用的 安卓模拟器_【译】移动开发中的仿真器与模拟器
  7. 性能优化系列第一篇——数据库性能优化
  8. Win7系统的EXCEL使用复制粘贴或者搜索就显示已停止工作的解决方法
  9. RN拆包实践的一些经验教训
  10. Android相关栏目开篇