单精度浮点数计算

学过要用,忘记了复习一下

单精度浮点数介绍以及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.M2进制),表示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

你可能感兴趣的:(通讯,信息与通信)