zoukankan      html  css  js  c++  java
  • JAVA浮点数的范围 和精度

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

    单精度源码及结果。 

     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                

    双精度源码及结果。 

     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)》

     

  • 相关阅读:
    log4j动态添加appender
    【翻译】java里编写基准测试的一些经验
    java线程池:获取运行线程数并控制线程启动速度
    maven里的mirror和repository: 配置多repository
    使用maven shade plugin 打可执行Jar包
    activemq plugin开发指南及示例
    通过加入classpath的形式实现命令行运行java程序时引入第三方jar包
    java异常、异常处理机制
    内部类
    接口
  • 原文地址:https://www.cnblogs.com/qiu18359243869/p/14318092.html
Copyright © 2011-2022 走看看