JAVA浮点数的范围 和精度

摘要:
(2) 浮点Q&A 1)浮点数字代表数据的范围是什么?最大值是可以用浮点数表示的最大值。具体值见表3。然而,从科学计算的角度来看,无论指数部分的值是多少,一个浮点数的有效位数都是由尾数部分决定的。单精度数的有效位为7,双精度数的无效位为16。当浮点集中没有与整数值对应的浮点数时,整数值将转换为最接近的浮点值。此时,整数值将失去精度。单精度源代码和结果。

本篇先介绍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进制表示的源码及运行结果。

单精度源码及结果。 

JAVA浮点数的范围 和精度第1张 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                

双精度源码及结果。 

JAVA浮点数的范围 和精度第2张 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                                    

参考资料:

1、IEEE754百度百科

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

 

免责声明:文章转载自《JAVA浮点数的范围 和精度》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇高级PHP开发:利用PHPEMS搭建在线考试平台Unity3D 原生Android结合UnityPlayerActivity开发遇到的问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jvm内存模型和内存分配

1.什么是jvm? (1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。 (2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。 (3)JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改...

字节码指令简介(转)

字节码指令简介(转) 原文阅读 操作码:一个字节长度、代表某种特定操作含义的数字。 操作数:跟在操作码后面0个或多个代表此操作所需的参数。 Java虚拟机的指令 = 操作码 + 操作数。由于Java虚拟机采用面向操作数栈,所以大多指令都不包含操作数,只有一个操作码。 Java虚拟机的解释器(不考虑异常): do { 自动计算PC寄存器...

汇编语言中的数据类型

目录 一、数制及相互转换 1. N 进制数转换为十进制数 2. 十进制数转换为 N 进制数 3. 二进制数转换为八进制数或十六进制数 4. 八进制数或十六进制数转换为二进制数 二、计算机中数和字符的表示 (一)计算机中数的表示方法 1. 原码表示法 2. 补码表示法 (二)二进制编码 1. 十进制数的二进制编码(BCD 码) 2. 字...

Tomcat8史上最全优化实践

Tomcat8史上最全优化实践 1、Tomcat8优化 1.1、Tomcat配置优化 1.1.1、部署安装tomcat8 1.1.2 禁用AJP连接 1.1.3、执行器(线程池) 1.1.4 3种运行模式 1.3、使用Apache JMeter进行测试 1.3.1、下载安装 1.3.2、修改主题和语言 1.3.3、创建首页的测试用例 1.3.4、...

php中浮点数计算问题

最近做一个关于价格的程序时,碰到了一个很奇怪的问题。我把问题给抓出来了。请看如下代码: <?php$a = 86.1 - 80.0;echo 6.1 - $a;?>   你会发现,echo出来的结果居然不是0,而是5.3290705182E-15。思索了半天,也没找到是什么原因。用了C语言试了一下,结果正常。同事说他以前也遇到过,估计是超出了P...

Java字节码常量池深入剖析

继续来分析Java字节码,上一节分析了魔数的规则,接下来继续往下分析,其上次总结的规则也一起贴出来: 1、使用javap -verbose命令分析一个字节码文件时,将会分析该字节码文件的魔数、版本号、常量池、类信息、类的构造方法、类中的方法信息、类变量与成员变量等信息。 2、魔数:所有的.class字节码文件的前4个字节都是魔数,魔数值为固定值:0xCAF...