**浮点数表示**
IEEE浮点标准用$V = (-1)^s * M * 2^E 的形式来表达一个数$:
- 符号(sign) s决定这个数是负数(s=1)还是正数(s=0),而对于数值0的符号解释作为特殊情况处理。
- 尾数(significand)M是一个二进制小数,它的范围是1~2-ω,或者是0~1-ω。
- 价码(exponent) E的作用是对浮点数加权,这个权重是2的E次幂(***可能是负数***)。
将浮点数的位表示划分为三个字段,分别对这些值进行编码:
1. 单独一个的符号位s直接龚方雄符号s.
2. k位的阶码字段$exp=e_{k-1}...e_1e_0编码阶码E。$
3. n位小数字段$frac =f_{n-1}...f_1f_0$编码尾数M,但是编码出来的值也依赖于阶码字段的值是否等于0。
> 对单精度float类型32位长度,s=1 ,k=8,n=25.规定了位表示后,根据k值分为三种情况:
![](/i/l/?n=23&i=blog/1922146/202212/1922146-20221216102933497-2013735628.jpg)
> **情况1:规格化的值**
> 这是最普遍的情况。当exp阶码字段的位模既不全为0(数值为0),也不全为1(单精度数为$2^8-1=255,双精度数2^{11}-1=2047$)时,都属于这类情况。
> 阶码被 解释为以偏置(bisaed)形式表示的有符号整数。即E=e-bisa,其中e是无符号数,其位表达为$e_{k-1}...e_1e_0$,而bias是一个等于$2^{k-1}-1的偏置值(单精度为127,双精度为1023)$。由此产生的指数的取值范围,对于单精度是-126~127,双精度是-1022~1023。
>对于小数字段frac的解释为描述小数值f,其中 0 ≥ f<1,其二进制表示为$0.f_{n-1}...f_1f_0$,尾数定义为M =1+f.这种方式也叫隐含的以1开头的表示,因为我们可以把M看成一个二进制表达式为$1.f_{n-1}...f_1f_0$的数字。既然我们总是能够调整阶码E,使得尾数M在范围1 ≤ M<2之中,那么这种表示是一种轻松获得一个额外精度位的技巧。
> **情况2:非规格化的值**
> 当阶码域为全0时, 所表示的数是非规格化形式。在这种情况下E =1-Bias,而尾数M= f,也就是不含隐含的开头1.
>>对于非规格化的值为什么这样设置偏置值?
>> 使阶码值为1 - Bias而不是简单地用0-Bias,似乎是违反直觉的,我们将很快看到,这种方式提供了一种从非规格化值平滑转换到规格化值的方法。
> - 非规格化数有两个用途:
> 1. 一种表示数值0的方法。因规格化数,我们必须使M ≥ 1,这样就不能表示0了。实际上,+0.0的浮点表示位模式为全0.
> 2. 非规格化数的别外一个功能是表示那些非常接近0.0的数。
>
> **情况3:特殊值**
> 最后一类数值是指当阶码全为1的时候出现的。
>>- 当小数域中全为0时,得到的值表示无穷,
****>> s =1时,为正无穷,s =0时,为负无穷。-----当我们返回两个非常大或小的值相乘可以表示溢出的结果.
>> - 当小数域为非零时,结果值被称为“NaN”,即返回这样的NaN值。