1005480 IEEE 754标准

IEEE 754标准

该篇将介绍浮点型数据使用的格式标准,并通过计算得出float和double的取值范围。

IEEE 754

  • IEEE 754标准是IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号,等同于国际标准ISO/IEC/IEEE 60559。该标准由美国电气电子工程师学会(IEEE)计算机学会旗下的微处理器标准委员会(Microprocessor Standards Committee, MSC)发布。

  • 这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number),一些特殊数值(无穷(inf)与非数值(NaN)),以及这些数值的[浮点数运算子];它也指明了四种数值修约规则和五种例外状况(包括例外发生的时机和处理方式)。

  • IEEE 754标准定义了计算机程序设计环境中的二进制和十进制的浮点数自述的交换、算术格式以及方法。

预备知识

  • 单精度浮点格式
    在这里插入图片描述

  • 不同精度对应的位数

    符号位指数偏移量(阶码)尾数
    real*41位符号位(s)8位指数(e)23位尾数(m)共32位 127(7FH)
    real*81位符号位(s)11位指数(e)52位尾数(m)共64位 1023(7FH)
    real*101位符号位(s)15位指数(e)64位尾数(m)共80位 16383(7FH)
    • s为0或1
    • m(值)=指数为对应的无符号二进制数转化的十进制数
      • 如10100011,则m(值)=163
    • m=0.23位尾数
      • 如23位尾数为00100100110000000000000,则m=0.00100100110000000000000(二进制)=0.0010010010999999999(十进制)
  • 计算公式

    V = (-1)^s * 2^E * M

    E的取值分如下情况

    • 当e各位全为’0’时,E=1-(2^(e(位数-1)-1)); M=m

      • 在real*4中
        • E = 1-(2^(8-1)-1)=-126
        • V = (-1)^s * 2^(-126) * m
    • 当e各位不全为’0’且不全为’1’时,E=e(值)-(2^(e(位数)-1)-1); M=1+M

      • 在real*4中
        • E = e(值)-(2^(8-1)-1)=e(值)-127
        • V = (-1)^s * 2^(e(值)-127) * (1+m)
      • 在real*8中
        • E = e(值)-(2^(11-1)-1)=e(值)-1023
        • V = (-1)^s * 2^(e(值)-1023) * (1+m)
    • 对于任何十进制数转化为二进制数,一直移动,一定能移动成1.xxx的格式。但有一种特殊情况(以float为例),当时当e移动至0时,尾数仍然没有到达1.xxx格式(如,0.001xxx)。这种情况下,只要有效位仍然在尾数的23位之内,就仍可以用float表达,故存在当e全为’0’时的特殊情况。

  • 特殊值

    • 如果指数是0且小数部分是0,这个数是±0(和符号位相关)
    • 如果指数是最大(全为1)且小数部分是0,这个数是±无穷大(同样和符号位相关)
    • 如果指数是最大(全为1)且小数部分非0,这个数表示为不是一个数(NaN)

计算方式

  • 任何数据在内存中都是以二进制(1或者0)顺序存储,每一个1或者0都称为1位。

  • 以float为例

    • 共计32位,折合4字节
    • 由最高到最低位分别是第31、30、29、……、0位
    • 31位是符号位,1表示为负,0为正
    • 20-23位,一共8位是指数位
    • 22-0位,一共23位是尾数位
  • 以12345.0f为例(不带小数)

    • 转化为二进制表示:1 11100010 01000000.0
    • 小数点左移,一直移到最高位只有一位,即1.11100010 010000000,共16位。
    • 在布尔运算中小数点每向左移一位就等于在以2为底的科学计算法表示中指数+1,所以原数就等于=1.11100010010000000*(2^16)
    • 显而易见,m的最高位永远是1,于是这里将1删除,所以尾数为(补全23位):11100010 01000000 0000000
    • 指数e=16,但因为e有正负,可以表示-127~128的有符号整数,且存储方式不为补码或反码形式,为了统一,将其加上127(其实就是移码,移码是符号位取反的补码),即e=143,二进制表示为:10001111
    • 12345.0f为正数,所以符号位为:0
    • 把它们拼起来就是:0 10001111 11100010 01000000 0000000
    • 转化成16进制:47 F1 20 00
    • 如果按照逆序存储的话就是:00 20 F1 47
  • 以-123.456f为例(带小数)

    • 转化为二进制表示:-1111011.0111010010111100011010100111111011111001110111
    • 小数点左移6位表示(保留23位):-1.11101101 11010010 1111000*(2^6)
    • e = 6+127 = 133,转化为二进制:10000101
    • m = 0.11101101 11010010 1111000
    • 符号位:1
    • 拼起来表示为:1 10000101 11101101 11010010 1111000
    • 转化为16进制:c2 f6 e9 78
  • 最大数

    • 根据前面规则,最大数二进制表示为:0 11111110 11111111 11111111 1111111
    • e = 2^8-1-1-127 = 127
    • m = 1.11111111111111111111111,转化成10进制为:1.9999998807907104
    • 所以Vmax = 1.9999998807907104*(2^127) = 340282346638528851437567810039546926146.0155202338291712 = 3.4028234663852886E38

示例

  • 参考代码/1004889study/src/com/z1004918/basedatatype/Float/IEEE754Float.java


thanks! **
--郑泽旺
**
2017-09-20
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值