学过要用,忘记了复习一下
单精度浮点数介绍以及16进制单精度浮点数的计算方式
问题背景:
在现场数采交付过程中,可能会碰到寄存器存储单精度浮点数的设备。此时我们在做点表的时候需要把数据类型改成单精度浮点数。因此下面就介绍一下从寄存器中读出来的16进制数转换成单精度浮点数的计算方法。
单精度浮点数:
单精度浮点数用来表示带小数部分的数据。占用4个字节(32位)的存储控键,因此需要2个寄存器(16字节)的值表示1个单精度浮点数。32位的数由符号位、指数位和尾数位三部分组成。
符号位S(sign) :左边第1个比特位的值表示符号,0表示正号、1表示符号;
指数位E(exponent):左边第2-9位8个比特位的值表示指数,实际指数值e=E-127。又称“移码”或“阶码”;e的值用来对尾数的小数点进行移位,例如:e=-3表示小数点向左移动3位、e=3表示小数点向右移动3位。
尾数位M(mantissa):左边第10-32位23个比特位的值表示尾数,又称“有效数字位”、“系数位”。实际尾数值m=1.M(2进制),表示2进制尾数M的首位前加一个隐藏位的值1和小数点表示成1.M。
32位浮点数的不同部分如下所示:
表(1) 32位浮点数不同部分的表示
符号位S(1位) | 指数位E(8位) | 尾数位M(23位) |
X | XXXXXXXX | XXXXXXXXXXXXXXXXXXXXXXX |
单精度浮点数的计算:
因此根据单精度的浮点数的定义,可以计算出一个16进制单精度的值。例如从寄存器中读到一个单精度浮点数的值为44 3F 4C B2(H)。那么它的10进制实际值就可以通过定义计算出来:
1、首先把16进制的值转化成32位的2进制数,需要注意不足32位的一定要在前面加0补齐,保证转化的是32位的2进制数;
443F4CB2(H)=0100 0100 0011 1111 0100 1100 1011 0010(2进制)
2、把32的2进制数按照符号位、指数位和尾数位划分为:
表(2) 443F4CB2(H)不同部分的值
符号位S(1位) | 指数位E(8位) | 尾数位M(23位) |
0 | 1000 1000 | 011 1111 0100 1100 1011 0010 |
因此,根据单精度浮点数的不同部分的定义得到这个浮点数的:符号S=0;指数E=1000 1000=136;尾数M=011 1111 0100 1100 1011 0010。
3、单精度浮点数实际值的计算
表(3) 单精度浮点数的实际值
符号 | 符号位S | 符号 |
0 | 表示单精度浮点数为正数 | |
指数(移位数) | 指数位E(8位) | e=E-127 |
10001000=136 | 136-127=9(小数点向右移动9位) | |
尾数 | 尾数位M(23位) | m=1.M |
011 1111 0100 1100 1011 0010 | 1. 011 1111 0100 1100 1011 0010 |
因此此单精度浮点数实际值就表示2进制数m的小数点向右移动9位的正数。即
10 1111 1101.0011 0010 1100 10
我们把这个2进制数1011111101.00110010110010(2进制)通过运算规则计算成10进制数,就可以得到的10进制的值:44 3F 4C B2(16进制单精度浮点数)=765.1983642578125。
表(4) 整数部分的值=765
整数 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
系数 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
表(5) 整数部分的值=0. 1983642578125
小数 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
系数 | 2-1 | 2-2 | 2-3 | 2-4 | 2-5 | 2-6 | 2-7 | 2-8 | 2-9 | 2-10 | 2-11 | 2-12 | 2-13 | 2-14 |
可以得出:16进制浮点数44 3F 4C B2的值为:765.1983642578125。