浮点数表示

IEEE754标准

80年代以前,每个计算机制造商都有自己的浮点数实现方法。1985年,电气电子工程师协会(IEEE)引入了被称为IEEE浮点数表示法(IEEE floating point Representation),得到所有计算机制造商的一致采用。

其表示形式为 $(-1)^S\ M\ 2^E$。在32位的单精度浮点数中,S占1位,M占8位,E占23位。在64位的双精度浮点数中,S占1位,M占16位,E占53位。

千万要注意,排列顺序是SEM,不是SME。记住位数由少到多即可。

20180903175301284.png

S是符号位(sign),确定该数是正数还是负数。M是尾数(mantissa或significant),即一个数的真数,标准总是把真数规格化为$1.xx..x$的形式,M取除去$1.$外的$xx..x$部分,并在末尾增加n个0,使M的位数符合标准;同时,小数点往左移动了几位,e就是几(往右就是负几)。E是指数或阶码(exponent),被解释为以偏执(biased)形式表示的有符号整数,因此用二进制补码表示。其值为$E=e-Bias$,其中e是无符号数,单精度浮点数的$Bias$(偏置)是$2^{8-1}-1=127$,$e$的范围是$[1..254]$,$E$的范围是$[-126..127]$。

例子

举个栗子,用IEEE754单精度浮点数表示$-125.75_D$。

首先,将十进制转为二进制,再规格化为$1.xx..x$形式——小数点往左移动6位,e为+6

\[-125.75_D = -111\ 1101.11*2^0 = -1.1111\ 0111*2^{+6}\]

则负数符号位S为1,M补齐23位,E=e+127。

M是用补码还是原码?

答:M是无符号数,没有原密码和补码的说法。因此M就是1.M后面的二进制数,1缺省表示,不用编码

\[S = 1_B \\ 1.M=1.1111\ 0111_B \\ M=1111\ 0111 \ 0000\ 0000\ 0000\ 000_B(单精度筹齐23位) \\ e=+6_D \\ E=e+127_D=6+127=133_D=1000\ 0101_B\]

组合起来就是$S_{(1)}\ E_{(8)}\ M_{(23)}$,即

\[1\ 1000\ 0101\ 1111\ 0111\ 0000\ 0000\ 0000\ 000_B \\ 1100\ 0010\ 1111\ 1011\ 1000\ 0000\ 0000\ 0000_B \\ C 2 F B 8 0 0 0_H\]

把单精度浮点数$8FEFC000_H$转为真数。

\(8FEFC000_H \\ =1000\ 1111\ 1110\ 1111\ 1100\ 0000\ 0000\ 0000_B \\ =1\ 00011111\ 11011111100000000000000_B\) 则

\(S=1 \\ E=0001\ 1111_B=31_D \\ E=e+127_D \\ e=E-127_D=31-127=-96_D \\ M=1101\ 1111\ 1000\ 0000\ 0000\ 000_B \\ 1.M=1.1101\ 1111\ 1_B \\\) 即

\[(-1)^1·1.M·2^0=-1.1101\ 1111 \ 1*2^{-96}\]