3.3 存储实数

实数是带有整数部分和小数部分的数字。

实数通常采用浮点表示法。

浮点表示法的一个数字分为三个部分:符号,位移量,定点数。

例如:6780000 = +6.78*10610^6 三部分为:符号(+),位移量(6),定点数(6.78)

3.3.1 浮点表示法的规范化

科学记数法(用于十进制)和浮点表示法(用于二进制)的结果中,定点数都是在小数点左边保留一位非零整数。

十进制:±d.xxxxxx   d:1~9,x:0~9  
二进制:±1.yyyyyy   y:0~1

二进制数规范化之后,浮点表示法只存储这个数的三部分信息:符号,指数和尾数(小数点右边的位)

例如:+1000111.0101
规范化:+1.0001110101*262^6
符号:+
指数:6
尾数:0001110101

3.3.2 浮点表示法的存储

  • 符号:
    用一个二进制位来存储(0或1)。

  • 指数:
    指数采用余码来存储。

  • 尾数:
    尾数作为无符号整数存储。

3.3.3 余码系统

指数是有符号的数,在余码系统中,正的和负的整数都可以作为无符号数存储。余码系统将要存储的数字加上一个偏移量,然后再存储。

偏移量为: 2m112^{m-1}-1,m为指数部分的位数

例如:如果用4位存储单元存储指数,偏移量为7,也称为余7码

3.3.4 IEEE标准 – 单精度和双精度浮点表示法

  • 单精度使用32位存储:符号1位,指数8位(偏移量127),尾数23位。也称为余127码。

  • 双精度使用64位存储:符号1位,指数11位(偏移量1023),尾数52位。也称为余1023码。

单精度和双精度对比

3.3.5 IEEE标准浮点数的存储

  • 在S中存储符号,0:正数;1:负数;

  • 将数字转换为二进制;

  • 规范化;

  • 找到E和M的值;

  • 连接S,E和M。

举例: 将5.75用单精度方法存储

  • 符号为正,S = 0

  • 十进制转换为二进制:5.75 = (101.11)2(101.11)_2

  • 规范化: (101.11)2(101.11)_2 = (1.0111)222(1.0111)_2 * 2^2

  • E = 2+偏移量 = 2+127 = 129 = (10000001)2(10000001)_2
    M=(0111)2(0111)_2,M不足23位,右边补0

  • 连接S,E,M:
    0 10000001 01110000000000000000000

3.3.6 IEEE标准浮点数还原

  • 找到S,E和M的值;

  • 如果S=0,符号为正,否则为负;

  • 计算指数,指数=E-127(或=E-1023);

  • 对尾数去规范化;

  • 将去规范化的数字变为二进制以求出绝对值;

  • 加上符号。

举例:

1100 1010 0000 0000 0111 0001 0000 1111
= -2104387.75

3.3.7 浮点数的溢出

浮点数有上溢和下溢两种情况。该表示法不能存储很小或很大的绝对值。

0的存储:S,E和M都为0。

3.3.8 浮点数的精度

5.0000001=?

5.0000002=?

5.0000003=?

2232^{23} = 8388608
单精度浮点数的精度为:6~7位有效数字

2522^{52} = 4503599627370496
双精度浮点数的精度为:15~16位有效数字