规格化表示

  • 把一个数的有效数字和数的范围在计算机的一个储存单位中分别予以表示
  • 数的小数点位置随比例因子的不同而在一定范围内自由浮动
    • 一个十进制数 N可以写成
      N = 10e X M
    • 一个R进制数 N可以写成
      N = Re X M

例:
156.78=15.678 X 101

=1.5678 X 102

=0.15678 X 103 = RE X M

对于二进制数:
1011.1101 = 0.10111101 X 2+4

= 10.111101 X 2+2

= 1.0111101 X 2+3(规格化表示法)

= 1.0111101 X 2+11(规格化表示法)

= RE X M


浮点数的二进制表示格式

Es E1 E2 …….. Em Es M1 M2 ……… Mn
阶符 <—-阶码—-> 数符 <—-尾数—->

32位单精度浮点数

31 30-23 22-0
S E M

由于整数和小数部分都储存在尾数位,所以浮点数的精度实际上包括整数和小数部分。,例如32位浮点数有23位尾数部分,2^23=8388608,意味着只能精确到7位。

64位双精度浮点数

63 62-52 51-0
S E M

关于阶码的偏移量

以8.25为例

首先将8.25转化为二进制

  • 整数部分

    8 / 2 = 4 余0
    4 / 2 = 2 余0
    2 / 2 = 1 余0
    1 / 2 = 0 余1

    结果为1000

  • 小数部分

    小数乘2取整数部分,结果再乘2直到小数为0

    0.25 X 2 = 0.5 整数为0
    0.5 X 2 = 1.0 整数为1 小数为0

    结果为01

最终结果为1000.01 指数计数法表示为1.00001 X 23

由于指数计数法整数位始终为1,所以在浮点数的表示中可以省略这一位

需要注意的是指数位(阶码)需要加上127的偏移量,8位指数范围为(-127 - 128),实际表示为0 - 255

IEEE754规定当阶码为0或全1时表示特殊值:指数位全1时,符号位为0并且尾数全0时表示正无穷,实际指数为128,此时阶码的实际表示为0-255,当指数位全0时,实际指数为-127。

去掉两个特殊数值后阶码实际范围为1 - 254,实际指数为-126 - 127,用移码减去127就可以得到E的真值。这就是为什么偏移量是127而不是128的原因

顺带说一句跟这篇笔记没关系的话,在整数补码中由于0有正负之分,IEEE754规定-128的补码就是0X80

所以8.25最终表示为

0100 0001 0000 0100 0000 0000 0000 0000

指数3加上偏移量0X7F得出最终8位阶码10000010