浮点数的一般表示
阶符 | 阶码 | 数符 | 尾数 |
- 阶符:阶码的符号位。1为负;0为正
- 阶码:即幂的大小。设幂e
- 数符:尾数的符号位。1为负;0为正
- 尾数:尾数的大小。设尾数M
一般基数 ,则浮点数真值
IEEE 754标准的浮点数
根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:
- S 表示符号位 ( sign ) ,当s=0,V为正数;当s=1,V为负数。
- M表示有效数字(又称尾数 、 mantissa),大于等于1,小于2。
2表示基数(base),E 表示指数位(exponent ,又称阶码)。
( 省略了阶码。因为移码就隐含表示了阶码的正负 )
浮点数的存储格式
符号的存储
符号的存储很容易,单独分配出一个位(Bit)来表示,用 0 表示正数,用 1 表示负数。
尾数的存储
当采用二进制形式后,尾数部分的取值范围为 1 ≤ mantissa < 2,这意味着:尾数的整数部分一定为 1,是一个恒定的值,这样就无需在内存中提现出来,可以将其直接截掉,只要把小数点后面的二进制数字放入内存中即可。对于 1.0011101,就是把 0011101 放入内存。
指数的存储
对于单精度float类型,指数域有8位,可以表示 0-255个指数值。双精度 double 类型,指数域有 11 位,可以表示 0 - 2047 个指数值。指数值规定了小数点的位置,小数点的移动代表了所表示数值的大小。
但是,指数可以为正数,也可以为负数。为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差 值为 -127,而双精度double类型的偏差值为 -1023。
如何记住单精度、双精度的偏差:
单精度 , 指数域有 8 位 ,可以表示的访问 [0 , 255] 。
偏差为 -(0 + 255)/2 = -127.5 , 向下取整 -127
双精度 , 指数域有 11 位 ,可以表示的访问 [0 , 2047] 。
偏差为 -(0 + 2047)/2 = -1023.5 , 向下取整 -1023
比如,单精度指数域中的64 则表示实际的指数值 -63。 偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成-127 到 128 之间(包含两端)。我们不久还将看到,实际的指数值-127(保存为 全 0)以及 +128(保存为全1)保留用作特殊值的处理。这样,实际可以表达的有效指数范围就在 -126 和 +127 之间。
规格化浮点数
规格化浮点数的特点是
-
-存储阶码的位既不全为0也不全为1,存储尾数的位可以随意定制。
示意图如下
单精度数的偏差 值为 -127,而双精度double类型的偏差值为 -1023。
对于单精度 float 类型,指数域有8位,可以表示 0 - 255 个值 。 规格化的浮点数存储阶码的位既不全为 0 也 不全为1,其能表示的值范围是 1 - 254 。单精度数的偏差 值为 -127。单精度规格化的浮点数的数阶码值的取值范围是-126 ~ 127
对于双精度 double 类型,指数域有 11 位,可以表示 0 - 2047个值 。 规格化的浮点数存储阶码的位既不全为 0 也 不全为1,其能表示的值范围是 1 - 2046。单精度数的偏差 值为 -1023。单精度规格化的浮点数的数阶码值的**取值范围是 -1022 ~ 1023 **
-
规定尾数的最高有效位必须为1,若尾数最高有效位不是1,则需要进行左归(即尾数整体左移一位),每左归一次,阶码加1,直到最高有效位为1。
尾数部分隐藏了一个整数1(隐藏一位1是为了增加一位有效位),因此尾数的实际大小为1 + M = 1. M 1+M=1.M1+M=1.M
比如,对单精度数而言,二进制的 1001.101(即十进制的 9.625)可以表达为 1.001101×23,所以实际保存的位数是:
00110100000000000000000
非格式化值
当指数位 E 全为 0 时,所表示的数就是非规格化形式
在这种情况下,而有效数字(尾数) M ,也就是说它是小数段的值,不包含隐含的开头的 1。
非规格化值有两个用途:
- 它提供了一种表示数值 0 的方法。因为规格化数必须得使有效数字 M 在范围 1≤M<2 之中,即 M≥1,因此它就不能表示 0
- 它表示那些非常接近于 0.0 的数。它们提供了一种属性,称为逐渐下溢出。其中,可能的数值分布均匀地接近于 0.0。
浮点数的取值访问
单精度 | 双精度 | |
---|---|---|
指数域 | 8 bit | |
尾数 | 23 bit | |
最小值 (最小负数) | S=-1 , M=1.111... , E= 127 | S=-1 , M=1.111... , E= 1023 |
最大负数 | S= -1 ,M=1.0 , E = 1 - 127 = -126 | |
最小正数 | S= 1 ,M=1.0 , E = 1 - 127 = -126 | |
最大正数 | S=1 , M=1.111... , E= 127 | S=-1 , M=1.111... , E= 1023 |
指数域 | 尾数 | 最小值 (最小负数) | 最大负数 | 最大值 (最大正数) | |
---|---|---|---|---|---|
单精度 | 8 bit | 23 bit | S=-1 , M=1.111... , E= 127 | S= -1 ,M= , E = 0 | S=1 , M=1.111... , E= 127 |
单精度 (非规格化) | 8 bit | 23 bit | |||
双精度 (规格化) | 11 bit | 52 bit | S=-1 , M=1.111... , E= 1023 | S=-1 , M=1.111... , E= 1023 | |
双精度 (非规格化) | 11 bit | 52 bit |