深入理解计算机操作系统(2.4.2)

IEEE浮点表示

IEEE浮点标准用V=(-1)^s * M * 2^E来表示一个数。
符号s:s是符号位,1表示负数,0表示正数。
尾数M:M是一个二进制小数,范围是1~2-δ,或者是0~1-δ。
阶码E:E的作用是对浮点数加权,这个权重是2的E次幂。

C语言中的float和double的表示:

深入理解计算机操作系统(2.4.2)

根据exp的值,被编码的值可以分成三种不同的情况,最后一种又分两种:
深入理解计算机操作系统(2.4.2)

规格化:当exp的值不全是0也不全是1时,就属于规格化的情况。
规格化中E被解释为以偏置形式表示的有符号整数。也就是说,阶码的值E=e-Bias,其中e是无符号数,也就是exp的值,Bias是一个2^(k-1)-1,k是exp的位数,单精度是Bias=127,双精度是Bias=1023。所以单精度E的取值范围-126~127,双精度为-1022~1023。(至于为什么exp的解释把不用补码数解释,我还没有理解)
小数字段frac被解释为描述小数值f,其中0<=f<1。尾数定义为M=1+f。

非规格化:当阶码域为全0时,所表示的数时非规格化形式。阶码值为E = 1 - Bias,尾数的值是M=F,不包含开头的1。
两种用途:1. 提供一种表示数值0的方法,不过-0.0和+0.0的二进制表示不同,-0.0的符号位是1,+0.0的符号位是0。因为浮点数的表示总体来说是用原码方式表示的,所以就存在0.0的二进制表示问题。2. 表示那些非常接近于0.0的数。

特殊值:当阶码全为1时,为特殊值。当小数域全为0时,得到的值表示无穷,当s=0时是正无穷,当s=1时是负无穷。当我们把两个非常大的数相乘,或者除以零时,无穷能够表示溢出的结果。当小数域为非零时,结果值被称为“NaN”,即“不是一个数(Not a Number)”,在一些应用 中,表示未初始化的数据时,他们也很有用处。