计组——浮点数的表示和IEEE 754标准以及相关运算(考前记一记,喝前摇一摇)

本文详细介绍了浮点数的作用、基本原理以及浮点数的表示方式,重点讲解了浮点数规格化的过程。通过实例解析了浮点数的规格化规则,包括左规和右规的情况。同时,深入探讨了IEEE754标准,解释了浮点数在该标准下的存储方式和计算方法,并给出了具体的转换和运算示例。
摘要由CSDN通过智能技术生成

由于定点数表示的数字范围有限,当我们在数据位数不变的情况下,想增加数据的长度时,该怎么办呢?这就是浮点数要解决的问题。
在这里插入图片描述
阶码E反映浮点数的表示范围及小数点的实际位置(数值的大小),其中阶符为正表示要把尾数的数值部分的小数点往后移,为负值表示要把小数点往前移
尾数M的数值部分的位数n反映浮点数的精度,其中数符表示正负

举个简单的例子类比一下:
1000 π 1000\pi 1000π
=3141.5926……
≈ 3.14 × 1 0 3 \approx3.14\times 10^{3} 3.14×103
≈ 0.314 × 1 0 4 \approx0.314\times 10^{4} 0.314×104
≈ 0.314159 × 1 0 4 \approx0.314159\times 10^{4} 0.314159×104
这里的乘号后面 1 0 x 10^{x} 10x 相当于是阶码部分,因为x均是正数,因此阶符都是0,此时x就是阶码的数值;乘号前面的3.14,0.314相当于尾数部分

一、浮点数的表示

定点数:
定点小数,小数点固定在第一位后面
定点整数,小数点固定在最后一位后面

浮点数:
阶码:常用补码或移码表示的定点整数
尾数:常用原码或补码表示的定点小数

浮点数的真值: N = r E × M N=r^{E}\times M N=rE×M
r 是浮点数阶码的底(隐含)通常 r=2;E称为阶码,M称为尾数。

尾数给出一个小数,阶码指明了小数点要向前/向后移动几位。

【例】阶码、尾数均用补码表示,求a,b的真值
a=0,01;1.1001
b=0,10;0.01001
【分析】a:阶码0,01对应真值+1;
尾数1.1001对应真值-0.0111;
a的真值:21 * (-0.0111)=-0.111(相当于小数点右移一位或者算数左移一位)

b:阶码0,10对应真值+2;
尾数0.01001对应真值+0.01001
b的真值:22 * (0.01001)=1.001(相当于算数左移两位)

1.浮点数的作用和基本原理

如果采用1B的存储空间存储a和b,a占8位正好;b占9位,如果将最后一位抛弃,势必降低了b的精度,此时,可采用浮点数规格化,保留浮点数精度
所以b = 22 * (0.01001) = 21 * (+0.1001)
这样保证了在存储空间不变的情况下,保留了浮点数的精度

2.浮点数规格化(重点)

规格化浮点数,规定尾数的最高位数值必须是一个有效值
左规:尾数算数左移一位(小数点右移),阶码减1,直到尾数最高位是有效位
右规:尾数算数右移一位(小数点左移),阶码加1(当浮点数运算的结果尾数出现溢出,双符号位为01或10时)

在这里插入图片描述
注:采用“双符号位”,当溢出发生时,可以挽救,更高的符号位是正确的符号位

3.浮点数的表示范围(了解)

1.用原码表示的尾数进行规格化
正数为0.1XX……X的形式,其最大值表示为0.11……1;最小值表示为0.10……0
尾数的表示范围是 1 2 ≤ M ≤ ( 1 − 2 − n ) \frac{1}{2}\leq M \leq (1-2^{-n}) 21M(12n)
负数为1.1XX……X的形式,其最大值表示为1.10……0;最小值表示为1.11……1
尾数的表示范围是 − ( 1 − 2 − n ) ≤ M ≤ − 1 2 -(1-2^{-n})\leq M \leq -\frac{1}{2} (12n)M21

2.用补码表示的尾数进行规格化
正数为0.1XX……X的形式,其最大值表示为0.11……1;最小值表示为0.10……0
尾数的表示范围是 1 2 ≤ M ≤ ( 1 − 2 − n ) \frac{1}{2}\leq M \leq (1-2^{-n}) 21M(12n)
负数为1.0XX……X的形式,其最大值表示为1.01……1;最小值表示为1.00……0
尾数的表示范围是 − 1 ≤ M ≤ − ( 1 2 + 2 − n ) -1\leq M \leq -(\frac{1}{2}+2^{-n}) 1M(21+2n)

4.浮点数规格化的题目

【例】若某浮点数的阶码、尾数用补码表示,共4+8位:
0,110;1.1110100,如何规格化?
【分析】阶码部分:+6
尾数部分:用补码表示,并且是负数,负数的补码,必须保证数值部分最高位一定是0,才能保证尾数尽可能多的表示一些精度,因为需要对尾数进行算数左移3位,低位补0,变为1.0100000,阶码减3
于是规格化后:0,011;1.0100000

注:
用原码还是补码表示,会影响规格化的规则
规格化原码尾数,最高数值位一定是1
规格化补码尾数,符号位与最高数值位一定相反

二、IEEE 754标准

在这里插入图片描述
在这里插入图片描述
不同之处:
尾数用原码表示,隐藏表示最高位 1 ,实际表示的尾数是 1. M {\color{Red} 尾数用原码表示,隐藏表示最高位1,实际表示的尾数是1.M} 尾数用原码表示,隐藏表示最高位1,实际表示的尾数是1.M(用原码表示时,最高位是有效位,所以是1)
偏置值 = 2 n − 1 − 1 {\color{Red} 偏置值=2^{n-1}-1} 偏置值=2n11
阶码全 0 、全 1 有特殊用途 {\color{Red} 阶码全0、全1有特殊用途} 阶码全0、全1有特殊用途,因此8位的阶码正常范围是-126~127

阶码用移码表示,移码=真值+偏置值,此时的偏置值= 2 n − 1 − 1 2^{n-1}-1 2n11
真值 -128=-1000 0000,此时偏置值为 0111 1111
移码=-1000 0000 + 0111 1111
= 0111 1111 - 1000 0000
= 1 0111 1111 - 1000 0000 (这一步操作是给被减数加了 2 8 2^{8} 28,最终结果是不变的)
= 1111 1111

【例】1.短浮点数 1 000 {\color{Red}1\color{Cyan}000} 1000 0001 { \color{Cyan} 0001} 0001 1 000 {\color{Cyan}1\color{green}000} 1000 1010 {\color{green}1010} 1010 0101 {\color{green}0101} 0101 0000 {\color{green}0000} 0000 1000 {\color{green}1000} 1000 0000 {\color{green}0000} 0000

数符s阶码E尾数数值M
1 {\color{Red}1} 1 00000011 {\color{Cyan}00000011} 00000011 00010100101000010000000 {\color{green}00010100101000010000000} 00010100101000010000000

规格化后的短浮点数的真值为: ( − 1 ) s × 1. M × 2 E − 127 (-1)^{s}\times 1.M\times 2^{E-127} (1)s×1.M×2E127
带入公式: ( − 1 ) 1 × 1.00010100101000010000000 × 2 3 − 127 (-1)^{1}\times 1.00010100101000010000000\times 2^{3-127} (1)1×1.00010100101000010000000×23127

2.短浮点数0100 1011 0111 1111 1111 1111 1111 1111
带入公式: ( − 1 ) 0 × 1.11111111111111111111111 × 2 150 − 127 (-1)^{0}\times 1.11111111111111111111111\times 2^{150-127} (1)0×1.11111111111111111111111×2150127=111111111111111111111111. (小数点右移23位)

【例】将十进制数-0.75转换为IEEE 754 的单精度浮点数格式表示
【分析】 ( − 0.75 ) 10 = ( − 0.11 ) 2 = ( − 1.1 ) 2 × 2 − 1 (-0.75)_{10}=(-0.11)_{2}=(-1.1)_{2}\times 2^{-1} (0.75)10=(0.11)2=(1.1)2×21
数符=1
尾数部分=.100 0000 0000 0000 0000 0000 0000 (隐含最高位是1)
阶码真值= -1
单精度浮点型偏移量=127D
移码=阶码真值+偏移量=-1+111 1111 = 0111 1110(凑足8位)
(或者移码=127-1=126,对应二进制 0111 1110)
因此,最终可知

数符s阶码E尾数数值M
10111 1110100 0000 0000 0000 0000 0000

【例】(2020年408)带符号整数用补码表示,float型数据用IEEE 754标准表示,当x机器数为C800 0000H时,x的值是()
【分析】
第一步,先十六进制转二进制:
C800 0000H = 1100 1000 0000 0000 0000 0000 0000 0000
第二步,确定数符、阶码和尾数:

数符s阶码E尾数数值M
1100 1000 0000 0000 0000 0000 0000 0000

第三步,逐个分析:
数符=1 --> 是个负数
尾数=.000 0000 0000 0000 0000 0000 0000 (隐含最高位是1) --> 尾数真值=1.0
阶码=100 1000 0= 2 7 + 2 4 2^{7}+2^{4} 27+24=144(移码),偏置值127D,由移码=真值+偏置值
因此阶码真值是=144-127=17

最终得出浮点数对应的真值= ( − 1.0 ) 2 × 2 17 (-1.0)_{2}\times 2^{17} (1.0)2×217= − 2 17 -2^{17} 217

三、浮点数加减运算的题目

【例】(2009年选择题13题)设浮点数的阶码和尾数均采用补码表示,且位数分别为5位和7位(均含两位符号位)。若有两个数X= 2 7 × 29 / 32 2^7\times29/32 27×29/32,Y= 2 5 × 5 / 8 2^5\times5/8 25×5/8,则用浮点数加法计算X+Y的最终结果。
【分析】29/32=11101/ 2 5 2^5 25=0.11101(小数点左移5位)
5/8=101/ 2 3 2^3 23=0.101(小数点左移3位)
那么,X:00,111;00,11101;Y:00,101;00,10100
第一步,对阶(小阶向大阶看齐)
X的阶码7比Y的阶码5大,因此将Y的阶码加2,尾数右移2位,变为Y:00,111;00,00101
第二步,尾数相加
X:00,111;00,11101
Y:00,111;00,00101
尾数相加即:00,11101+00,00101=01,00010;相加后符号位为01,故需要右规(算数右移)
第三步,规格化
尾数右移一位,阶码加1,即就是:01,000;00,10001
第四步,判断溢出
符号位为01,说明发生了溢出(上溢)👉参考链接: 一位符号位和两位符号位的溢出判断

四、附图

在这里插入图片描述

在这里插入图片描述

  • 11
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值